caecf26e6143286ae38c236d7c6f2f54325c3fb7
[unfold.git] / sla / slaclient / service / fed4fire / fed4fireservice.py
1 # -*- coding: utf-8 -*-\r
2 """Builds templates/agreements based on input data (in json format), submitting\r
3 to sla manager.\r
4 \r
5 It is intended as backend service for a rest interface.\r
6 \r
7 The json input must work together with the templates to form a valid template\r
8  or agreement for Xifi (be careful!)\r
9 \r
10 This (very simple) service is coupled to the way xifi is interpreting\r
11 ws-agreement.\r
12 \r
13 \r
14 """\r
15 import json\r
16 import jsonparser\r
17 from sla.slaclient import wsag_model\r
18 from sla.slaclient import restclient\r
19 from sla.slaclient.templates.fed4fire.django.factory import Factory as TemplateFactory\r
20 import sla.slaclient.templates.fed4fire as fed4fire\r
21 from time import localtime, strftime\r
22 import uuid\r
23 class ServiceContext(object):\r
24     def __init__(self, restfactory = None, templatefactory=None):\r
25         """\r
26         :type restfactory: restclient.Factory\r
27         """\r
28         self.restfactory = restfactory\r
29         self.templatefactory = templatefactory\r
30 \r
31 \r
32 def createprovider(json_data, context):\r
33     """Creates a provider in the SlaManager.\r
34     :type json_data:str\r
35     :type context: ServiceContext\r
36 \r
37     An example input is:\r
38     {\r
39         "uuid": "f4c993580-03fe-41eb-8a21-a56709f9370f",\r
40         "name": "provider"\r
41     }\r
42     """\r
43     json_obj = json.loads(json_data)\r
44     p = wsag_model.Provider.from_dict(json_obj)\r
45     provider_client = context.restfactory.providers()\r
46     provider_client.create(p)\r
47 \r
48 \r
49 def createtemplate(json_data, context):\r
50     """Creates a template in the SlaManager\r
51 \r
52     An example input is:\r
53     {\r
54         "template_id" : "template-id",\r
55         "template_name" : "template-name",\r
56         "provider" : "provider-1",\r
57         "service_id" : "service-id",\r
58         "expiration_time" : "2014-03-28T13:55:00Z",\r
59         "service_properties" : [\r
60             {\r
61                 "name" : "uptime",\r
62                 "servicename" : "service-a",\r
63                 "metric" : "xs:double",\r
64                 "location" : "//service-a/uptime"\r
65             }\r
66         ]\r
67     }\r
68 \r
69     :type json_data:str\r
70     :type context: ServiceContext\r
71     """\r
72     data = jsonparser.templateinput_from_json(json_data)\r
73     slatemplate = sla.slaclient.templates.fed4fire.render_slatemplate(data)\r
74     client = context.restfactory.templates()\r
75     client.create(slatemplate)\r
76 \r
77 \r
78 def createagreement(json_data, context):\r
79     """Creates an agreement in the SlaManager.\r
80 \r
81     The template with template_id is retrieved and the properties and some\r
82     context info is copied to the agreement.\r
83 \r
84     An example input is:\r
85     {\r
86         "template_id" : "template-id",\r
87         "agreement_id" : "agreement-id",\r
88         "expiration_time" : "2014-03-28T13:55:00Z",\r
89         "consumer" : "consumer-a",\r
90         "guarantees" : [\r
91             {\r
92                 "name" : "uptime",\r
93                 "bounds" : [ "0", "1" ]\r
94             }\r
95         ]\r
96     }\r
97     :type json_data:str\r
98     :type context: ServiceContext\r
99     """\r
100     client_templates = context.restfactory.templates()\r
101 \r
102     # Builds AgreementInput from json\r
103     data = jsonparser.agreementinput_from_json(json_data)\r
104     # Read template from manager\r
105     slatemplate, request = client_templates.getbyid(data.template_id)\r
106     # Copy (overriding if necessary) from template to AgreementInput\r
107     final_data = data.from_template(slatemplate)\r
108     slaagreement = fed4fire.render_slaagreement(final_data)\r
109 \r
110     client_agreements = context.restfactory.agreements()\r
111     return client_agreements.create(slaagreement)\r
112     \r
113 \r
114 def createagreementsimplified(template_id, user, expiration_time):\r
115         context = ServiceContext(\r
116             restclient.Factory(),\r
117             TemplateFactory()\r
118         )\r
119         \r
120         agreement = {\r
121             "agreement_id": str(uuid.uuid4()),\r
122             "template_id": template_id,\r
123             "expiration_time": expiration_time,\r
124             "consumer": user,\r
125         }\r
126     \r
127         json_data = json.dumps(agreement)\r
128 \r
129         return createagreement(json_data, context)\r
130     \r
131 def main():\r
132     createagreementsimplified("iMindsServiceWiLab2", "virtualwall", "2014-04-34T23:12:12")\r
133 \r
134 \r
135 if __name__ == "__main__":\r
136     main()\r
137       \r
138         \r