1
# Microsoft Azure Linux Agent
3
# Copyright 2014 Microsoft Corporation
5
# Licensed under the Apache License, Version 2.0 (the "License");
6
# you may not use this file except in compliance with the License.
7
# You may obtain a copy of the License at
9
# http://www.apache.org/licenses/LICENSE-2.0
11
# Unless required by applicable law or agreed to in writing, software
12
# distributed under the License is distributed on an "AS IS" BASIS,
13
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
# See the License for the specific language governing permissions and
15
# limitations under the License.
17
# Requires Python 2.4+ and Openssl 1.0+
23
import xml.dom.minidom
24
import azurelinuxagent.common.logger as logger
25
from azurelinuxagent.common.exception import ProtocolError, HttpError
26
from azurelinuxagent.common.future import ustr
27
import azurelinuxagent.common.utils.restutil as restutil
29
def validate_param(name, val, expected_type):
31
raise ProtocolError("{0} is None".format(name))
32
if not isinstance(val, expected_type):
33
raise ProtocolError(("{0} type should be {1} not {2}"
34
"").format(name, expected_type, type(val)))
36
def set_properties(name, obj, data):
37
if isinstance(obj, DataContract):
38
validate_param("Property '{0}'".format(name), data, dict)
39
for prob_name, prob_val in data.items():
40
prob_full_name = "{0}.{1}".format(name, prob_name)
42
prob = getattr(obj, prob_name)
43
except AttributeError:
44
logger.warn("Unknown property: {0}", prob_full_name)
46
prob = set_properties(prob_full_name, prob, prob_val)
47
setattr(obj, prob_name, prob)
49
elif isinstance(obj, DataContractList):
50
validate_param("List '{0}'".format(name), data, list)
51
for item_data in data:
53
item = set_properties(name, item, item_data)
59
def get_properties(obj):
60
if isinstance(obj, DataContract):
63
for prob_name, prob in list(props.items()):
64
data[prob_name] = get_properties(prob)
66
elif isinstance(obj, DataContractList):
69
item_data = get_properties(item)
70
data.append(item_data)
75
class DataContract(object):
78
class DataContractList(list):
79
def __init__(self, item_cls):
80
self.item_cls = item_cls
83
Data contract between guest and host
85
class VMInfo(DataContract):
86
def __init__(self, subscriptionId=None, vmName=None, containerId=None,
87
roleName=None, roleInstanceName=None, tenantName=None):
88
self.subscriptionId = subscriptionId
90
self.containerId = containerId
91
self.roleName = roleName
92
self.roleInstanceName = roleInstanceName
93
self.tenantName = tenantName
95
class Cert(DataContract):
96
def __init__(self, name=None, thumbprint=None, certificateDataUri=None):
98
self.thumbprint = thumbprint
99
self.certificateDataUri = certificateDataUri
101
class CertList(DataContract):
103
self.certificates = DataContractList(Cert)
105
#TODO: confirm vmagent manifest schema
106
class VMAgentManifestUri(DataContract):
107
def __init__(self, uri=None):
110
class VMAgentManifest(DataContract):
111
def __init__(self, family=None):
113
self.versionsManifestUris = DataContractList(VMAgentManifestUri)
115
class VMAgentManifestList(DataContract):
117
self.vmAgentManifests = DataContractList(VMAgentManifest)
119
class Extension(DataContract):
120
def __init__(self, name=None, sequenceNumber=None, publicSettings=None,
121
protectedSettings=None, certificateThumbprint=None):
123
self.sequenceNumber = sequenceNumber
124
self.publicSettings = publicSettings
125
self.protectedSettings = protectedSettings
126
self.certificateThumbprint = certificateThumbprint
128
class ExtHandlerProperties(DataContract):
131
self.upgradePolicy = None
133
self.extensions = DataContractList(Extension)
135
class ExtHandlerVersionUri(DataContract):
139
class ExtHandler(DataContract):
140
def __init__(self, name=None):
142
self.properties = ExtHandlerProperties()
143
self.versionUris = DataContractList(ExtHandlerVersionUri)
145
class ExtHandlerList(DataContract):
147
self.extHandlers = DataContractList(ExtHandler)
149
class ExtHandlerPackageUri(DataContract):
150
def __init__(self, uri=None):
153
class ExtHandlerPackage(DataContract):
154
def __init__(self, version = None):
155
self.version = version
156
self.uris = DataContractList(ExtHandlerPackageUri)
157
# TODO update the naming to align with metadata protocol
158
self.isinternal = False
160
class ExtHandlerPackageList(DataContract):
162
self.versions = DataContractList(ExtHandlerPackage)
164
class VMProperties(DataContract):
165
def __init__(self, certificateThumbprint=None):
166
#TODO need to confirm the property name
167
self.certificateThumbprint = certificateThumbprint
169
class ProvisionStatus(DataContract):
170
def __init__(self, status=None, subStatus=None, description=None):
172
self.subStatus = subStatus
173
self.description = description
174
self.properties = VMProperties()
176
class ExtensionSubStatus(DataContract):
177
def __init__(self, name=None, status=None, code=None, message=None):
181
self.message = message
183
class ExtensionStatus(DataContract):
184
def __init__(self, configurationAppliedTime=None, operation=None,
185
status=None, seq_no=None, code=None, message=None):
186
self.configurationAppliedTime = configurationAppliedTime
187
self.operation = operation
189
self.sequenceNumber = seq_no
191
self.message = message
192
self.substatusList = DataContractList(ExtensionSubStatus)
194
class ExtHandlerStatus(DataContract):
195
def __init__(self, name=None, version=None, status=None, code=0,
198
self.version = version
201
self.message = message
202
self.extensions = DataContractList(ustr)
204
class VMAgentStatus(DataContract):
205
def __init__(self, version=None, status=None, message=None):
206
self.version = version
208
self.message = message
209
self.extensionHandlers = DataContractList(ExtHandlerStatus)
211
class VMStatus(DataContract):
213
self.vmAgent = VMAgentStatus()
215
class TelemetryEventParam(DataContract):
216
def __init__(self, name=None, value=None):
220
class TelemetryEvent(DataContract):
221
def __init__(self, eventId=None, providerId=None):
222
self.eventId = eventId
223
self.providerId = providerId
224
self.parameters = DataContractList(TelemetryEventParam)
226
class TelemetryEventList(DataContract):
228
self.events = DataContractList(TelemetryEvent)
230
class Protocol(DataContract):
233
raise NotImplementedError()
235
def get_vminfo(self):
236
raise NotImplementedError()
239
raise NotImplementedError()
241
def get_vmagent_manifests(self):
242
raise NotImplementedError()
244
def get_vmagent_pkgs(self):
245
raise NotImplementedError()
247
def get_ext_handlers(self):
248
raise NotImplementedError()
250
def get_ext_handler_pkgs(self, extension):
251
raise NotImplementedError()
253
def download_ext_handler_pkg(self, uri):
255
resp = restutil.http_get(uri, chk_proxy=True)
256
if resp.status == restutil.httpclient.OK:
258
except HttpError as e:
259
raise ProtocolError("Failed to download from: {0}".format(uri), e)
261
def report_provision_status(self, provision_status):
262
raise NotImplementedError()
264
def report_vm_status(self, vm_status):
265
raise NotImplementedError()
267
def report_ext_status(self, ext_handler_name, ext_name, ext_status):
268
raise NotImplementedError()
270
def report_event(self, event):
271
raise NotImplementedError()