/usr/share/conjure-up/macumba/v1.py is in conjure-up 0.1.0.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 | from .api import Base, query_cs
from .errors import ServerError
from .jobs import Jobs
# https://github.com/juju/juju/blob/master/api/facadeversions.go
_FACADE_VERSIONS = {
"Action": 0,
"Addresser": 1,
"Agent": 1,
"AllWatcher": 0,
"AllEnvWatcher": 1,
"Annotations": 1,
"Backups": 0,
"Block": 1,
"Charms": 1,
"CharmRevisionUpdater": 0,
"Client": 0,
"Cleaner": 1,
"Deployer": 0,
"DiskManager": 1,
"EntityWatcher": 1,
"Environment": 0,
"EnvironmentManager": 1,
"FilesystemAttachmentsWatcher": 1,
"Firewaller": 1,
"HighAvailability": 1,
"ImageManager": 1,
"ImageMetadata": 1,
"InstancePoller": 1,
"KeyManager": 0,
"KeyUpdater": 0,
"LeadershipService": 1,
"Logger": 0,
"MachineManager": 1,
"Machiner": 0,
"MetricsManager": 0,
"Networker": 0,
"NotifyWatcher": 0,
"Pinger": 0,
"Provisioner": 1,
"Reboot": 1,
"RelationUnitsWatcher": 0,
"Resumer": 1,
"Rsyslog": 0,
"Service": 1,
"Storage": 1,
"Spaces": 1,
"Subnets": 1,
"StorageProvisioner": 1,
"StringsWatcher": 0,
"SystemManager": 1,
"Upgrader": 0,
"Uniter": 2,
"UserManager": 0,
"VolumeAttachmentsWatcher": 1,
}
class JujuClient(Base):
API_VERSION = 1
FACADE_VERSIONS = _FACADE_VERSIONS
def status(self):
""" Returns status of juju environment """
return self.call(dict(Type="Client",
Request="FullStatus"),
timeout=60)
def get_watcher(self):
""" Returns watcher """
return self.call(dict(Type="Client",
Request="WatchAll"))
def get_watched_tasks(self, watcher_id):
""" Returns a list of all watches for Id """
return self.call(dict(Type="AllWatcher",
Request="Next",
Id=watcher_id))
def add_charm(self, charm_url):
""" Adds charm """
return self.call(dict(Type="Client",
Request="AddCharm",
Params=dict(URL=charm_url)))
def get_charm(self, charm_url):
""" Get charm """
return self.call(dict(Type='Client',
Request='CharmInfo',
Params=dict(CharmURL=charm_url)))
def add_machine(self, series="", constraints={},
machine_spec="", parent_id="", container_type=""):
"""Allocate a new machine from the iaas provider.
"""
if machine_spec:
err_msg = "Cant specify machine spec with container_type/parent_id"
assert not (parent_id or container_type), err_msg
parent_id, container_type = machine_spec.split(":", 1)
params = dict(
Series=series,
ContainerType=container_type,
ParentId=parent_id,
Constraints=self._prepare_constraints(constraints),
Jobs=[Jobs.HostUnits])
return self.add_machines([params])
def add_machines(self, machines):
""" Add machines """
return self.call(dict(Type="Client",
Request="AddMachines",
Params=dict(MachineParams=machines)))
def destroy_machines(self, machine_ids, force=False):
params = {"MachineNames": machine_ids}
if force:
params["Force"] = True
return self.call(dict(Type="Client",
Request="DestroyMachines",
Params=params))
def resolved(self, unit_name, retry=0):
""" Resolved """
return self.call(dict(Type="Client",
Request="Resolved",
Params=dict(UnitName=unit_name,
Retry=retry)))
def get_public_address(self, target):
""" Gets public address of instance """
return self.call(dict(Type="Client",
Request="PublicAddress",
Params=dict(Target=target)))
def info(self):
""" Returns Juju environment state """
return self.call(dict(Type="Client",
Request="EnvironmentInfo"))
def get_env_constraints(self):
""" Get environment constraints """
return self.call(dict(Type="Client",
Request="GetEnvironmentConstraints"))
def set_env_constraints(self, constraints):
""" Set environment constraints """
return self.call(dict(Type="Client",
Request="SetEnvironmentConstraints",
Params=constraints))
def get_env_config(self):
""" Get environment config """
return self.call(dict(Type="Client",
Request="EnvironmentGet"))
def set_env_config(self, config):
""" Sets environment config variables """
return self.call(dict(Type="Client",
Request="EnvironmentSet",
Params=dict(Config=config)))
def add_relation(self, endpoint_a, endpoint_b):
""" Adds relation between units """
try:
rv = self.call(dict(Type="Client",
Request="AddRelation",
Params=dict(Endpoints=[endpoint_a,
endpoint_b])))
except ServerError as e:
# do not treat pre-existing relations as exceptions:
if 'relation already exists' in e.response['Error']:
rv = e.response
else:
raise e
return rv
def remove_relation(self, endpoint_a, endpoint_b):
""" Removes relation """
return self.call(dict(Type="Client",
Request="DestroyRelaiton",
Params=dict(Endpoints=[endpoint_a,
endpoint_b])))
def deploy(self, charm, service_name, num_units=1, config_yaml="",
constraints=None, machine_spec=""):
""" Deploy a charm to an instance
:param str charm: Name of charm
:param str service_name: name of service
:param int num_units: number of units
:param str config_yaml: charm configuration options
:param dict constraints: deploy constraints
:param str machine_spec: Type of machine to deploy to
:returns: Deployed charm status
"""
params = {'ServiceName': service_name}
_url = query_cs(charm)
params['CharmUrl'] = _url['charm']['url']
params['NumUnits'] = num_units
params['ConfigYAML'] = config_yaml
if constraints:
params['Constraints'] = self._prepare_constraints(
constraints)
if machine_spec:
params['ToMachineSpec'] = machine_spec
return self.call(dict(Type="Client",
Request="ServiceDeploy",
Params=dict(params)))
def set_annotations(self, entity, entity_type, annotation):
""" Sets annotations.
:param dict annotation: dict with string pairs.
"""
return self.call(dict(Type="Client",
Request="SetAnnotations",
Params=dict(Tag="%s-%s" % (entity_type, entity),
Pairs=annotation)))
def get_annotations(self, entity, entity_type):
""" Gets annotations """
return self.call(dict(Type="Client",
Request="GetAnnotations",
Params=dict(Tag="%s-%s" % (entity_type,
entity))))
def set_config(self, service_name, config_keys):
""" Sets machine config """
return self.call(dict(Type="Client",
Request="ServiceSet",
Params=dict(ServiceName=service_name,
Options=config_keys)))
def unset_config(self, service_name, config_keys):
""" Unsets machine config """
return self.call(dict(Type="Client",
Request="ServiceUnset",
Params=dict(ServiceName=service_name,
Options=config_keys)))
def set_charm(self, service_name, charm_url, force=0):
return self.call(dict(Type="Client",
Request="ServiceSetCharm",
Params=dict(ServiceName=service_name,
CharmUrl=charm_url,
Force=force)))
def get_service(self, service_name):
""" Get charm, config, constraits for srevice"""
return self.call(dict(Type="Client",
Request="ServiceGet",
Params=dict(ServiceName=service_name)))
def get_config(self, service_name):
""" Get service configuration """
svc = self.get_service(service_name)
return svc['Config']
def get_constraints(self, service_name):
""" Get service constraints """
return self.call(dict(Type="Client",
Request="GetServiceConstraints",
Params=dict(ServiceName=service_name)))
def set_constraints(self, service_name, constraints):
""" Sets service level constraints """
return self.call(dict(Type="Client",
Request="SetServiceConstraints",
Params=dict(ServiceName=service_name,
Constraints=constraints)))
def update_service(self, service_name, charm_url, force_charm_url=0,
min_units=1, settings={}, constraints={}):
""" Update service """
return self.call(dict(Type="Client",
Request="SetServiceConstraints",
Params=dict(ServiceName=service_name,
CharmUrl=charm_url,
MinUnits=min_units,
SettingsStrings=settings,
Constraints=constraints)))
def destroy_service(self, service_name):
""" Destroy a service """
return self.call(dict(Type="Client",
Request="ServiceDestroy",
Params=dict(ServiceName=service_name)))
def expose(self, service_name):
""" Expose a service """
return self.call(dict(Type="Client",
Request="ServiceExpose",
Params=dict(ServiceName=service_name)))
def unexpose(self, service_name):
""" Unexpose service """
return self.call(dict(Type="Client",
Request="ServiceUnexpose",
Params=dict(ServiceName=service_name)))
def valid_relation_name(self, service_name):
""" All possible relation names for service """
return self.call(dict(Type="Client",
Request="ServiceCharmRelations",
Params=dict(ServiceName=service_name)))
def add_unit(self, service_name, num_units=1, machine_spec=""):
""" Add unit
:param str service_name: Name of charm
:param int num_units: Number of units
:param str machine_spec: Type of machine to deploy to
:returns dict: Units added
"""
params = {}
params['ServiceName'] = service_name
params['NumUnits'] = num_units
if machine_spec:
params['ToMachineSpec'] = machine_spec
return self.call(dict(Type="Client",
Request="AddServiceUnits",
Params=dict(params)))
def remove_unit(self, unit_names):
""" Removes unit """
return self.call(dict(Type="Client",
Request="DestroyServiceUnits",
Params=dict(UnitNames=unit_names)))
|