def define(self, clustername=None, **kwargs): """Define a cluster. kwargs are passed to Cluster :returns: a cluster :rtype: :class:`Cluster` """ clustername = clustername or Default.generate_name( Names.CLUSTER_COUNTER) # remove None to defer default definitions to later for k in kwargs.keys(): if kwargs[k] is None: del kwargs[k] try: spec = db.select(SPECIFICATION, name=clustername, type='cluster')[0] spec.update(kwargs) db.updateObj(spec) except IndexError: spec = SPECIFICATION(clustername, 'cluster', kwargs) db.insert(spec) Default.set_specification(clustername) Console.ok('Defined cluster {}'.format(clustername))
def use(self, specname): """Activate the given specification :param specname: namne of the specification """ spec = db.select(SPECIFICATION, type='stack', name=specname)[0] Default.set_stack(spec.name)
def test_007(self): HEADING(" set default variable ") name = "myvar" value = "myvalue" cloud = self.data.cloud Default.set(name, value, cloud) assert Default.get(name=name, category=cloud) == value
def allocate(self, clustername=None): specname = clustername or Default.active_specification try: spec = db.select(SPECIFICATION, name=specname)[0] except IndexError: Console.error( 'No specification with name={} found'.format(specname)) return 1 defns = spec.get() try: cluster = db.select(Cluster, name=spec.name, specId=spec.cm_id)[0] except IndexError: cluster = Cluster(name=spec.name, specId=spec.cm_id, **defns) Default.set_cluster(cluster.name) Console.ok('Cluster {} is now active'.format(cluster.name)) cluster.create() Console.ok('Cluster {} created'.format(cluster.name)) return cluster
def undefine(self, specname=None, all=False): specs = set() if all: for spec in db.select(SPECIFICATION, type='cluster'): specs.add(spec) try: spec = db.select(SPECIFICATION, type='cluster', name=specname or Default.active_specification)[0] specs.add(spec) except IndexError: pass for spec in specs: try: cluster = db.select(Cluster, specId=spec.cm_id)[0] Console.warning('Cannot undefine allocated cluster {}.'.format( cluster.name)) Console.warning('Please delete the cluster first') continue except IndexError: pass db.delete_(SPECIFICATION, cm_id=spec.cm_id) Console.ok('Undefined specification {}'.format(spec.name)) try: spec = db.select(SPECIFICATION, type='cluster')[0] Default.set_specification(spec.name) except IndexError: pass
def reset_defaults(cls): #secgroup = "{}-default".format(Default.user) secgroup = "default" Default.set_secgroup(secgroup) # nova secgroup-add-rule default icmp -1 -1 0.0.0.0/0 SecGroup.add_rule_to_db(group=secgroup, name="ssh", from_port="22", to_port="22", protocol="tcp", cidr="0.0.0.0/0") SecGroup.add_rule_to_db(group=secgroup, name="http", from_port="80", to_port="80", protocol="tcp", cidr="0.0.0.0/0") SecGroup.add_rule_to_db(group=secgroup, name="https", from_port="443", to_port="443", protocol="tcp", cidr="0.0.0.0/0") SecGroup.add_rule_to_db(group=secgroup, name="icmp", from_port="-1", to_port="-1", protocol="icmp", cidr="0.0.0.0/0")
def set_level(log_level): """ sets th eloglevel in the database and the loglevel file from cloudmesh.yaml :param log_level: the loglevel :return: """ # TODO: BUG: This seems inconsistent with our use as it mixes db and # cloudmesh.yaml. level = log_level.upper() Default.set(key=LogUtil.LOG_LEVEL_KEY, value=log_level, category=LogUtil.category) # get log level obj log_level_obj = LogUtil.get_level_obj(log_level) # Read the ConfigDict config = ConfigDict("cloudmesh.yaml") log_file = config["cloudmesh"]["logging"]["file"] # Set the logger config logging.basicConfig(format=LogUtil.FORMAT, level=log_level_obj, filename=path_expand(log_file)) LOGGER.info("Set log level to: " + log_level) return "Ok."
def undefine(self, specname=None, all=False): specs = set() if all: for spec in db.select(SPECIFICATION, type='cluster'): specs.add(spec) try: spec = db.select(SPECIFICATION, type='cluster', name=specname or Default.active_specification)[0] specs.add(spec) except IndexError: pass for spec in specs: try: cluster = db.select(Cluster, specId=spec.cm_id)[0] Console.warning('Cannot undefine allocated cluster {}.'.format(cluster.name)) Console.warning('Please delete the cluster first') continue except IndexError: pass db.delete_(SPECIFICATION, cm_id = spec.cm_id) Console.ok('Undefined specification {}'.format(spec.name)) try: spec = db.select(SPECIFICATION, type='cluster')[0] Default.set_specification(spec.name) except IndexError: pass
def delete(self, clusternames=None, force=False, all=False): """Delete clusters that have these names. If not specified, delete the active cluster. If there is no active cluster, delete the first cluster. :param list clusternames: list of cluster names to delete """ if all: clusters = db.select(Cluster) else: clusternames = clusternames or [Default.cluster] clusters = [ db.select(Cluster, name=name).one() for name in clusternames ] for cluster in clusters: Console.ok('Deleting cluster {}'.format(cluster.name)) cluster.delete(force=force) Console.ok('Deleted cluster {}: {} nodes'.format( cluster.name, cluster.count)) remaining_clusters = db.select(Cluster).all() if remaining_clusters: name = remaining_clusters[-1].name else: name = None Default.set_cluster(name) Console.ok('Active cluster: {}'.format(name))
def refresh(cls, **kwargs): # print("Inside refresh") refreshed = cls.cm.refresh("vm", kwargs["cloud"]) # update counter vms = cls.cm.find(kind='vm') me = Default.user for vm in vms: name = vm['name'] if not name.startswith(me): continue number = name.split('-')[-1] try: # +1 as the stored counter is the next available counter new_counter = int(number) + 1 except ValueError: # name is not formatted correctly, possibly due to not # being started using cloudmesh continue old_counter = Default.get_counter(Names.VM_COUNTER) counter = max(new_counter, old_counter) Default.set_counter(Names.VM_COUNTER, counter) Console.debug_msg('Set counter ' + Names.VM_COUNTER + ' to ' + str(Default.get_counter(Names.VM_COUNTER))) return refreshed
def define(self, clustername=None, **kwargs): """Define a cluster. kwargs are passed to Cluster :returns: a cluster :rtype: :class:`Cluster` """ clustername = clustername or Default.generate_name(Names.CLUSTER_COUNTER) # remove None to defer default definitions to later for k in kwargs.keys(): if kwargs[k] is None: del kwargs[k] try: spec = db.select(SPECIFICATION, name=clustername, type='cluster')[0] spec.update(kwargs) db.updateObj(spec) except IndexError: spec = SPECIFICATION(clustername, 'cluster', kwargs) db.insert(spec) Default.set_specification(clustername) Console.ok('Defined cluster {}'.format(clustername))
def reset_defaults(cls): secgroup = "{}-default".format(Default.user) Default.set_secgroup(secgroup) # nova secgroup-add-rule default icmp -1 -1 0.0.0.0/0 SecGroup.add_rule_to_db(group=secgroup, name="ssh", from_port="22", to_port="22", protocol="tcp", cidr="0.0.0.0/0") SecGroup.add_rule_to_db(group=secgroup, name="http", from_port="80", to_port="80", protocol="tcp", cidr="0.0.0.0/0") SecGroup.add_rule_to_db(group=secgroup, name="https", from_port="443", to_port="443", protocol="tcp", cidr="0.0.0.0/0") SecGroup.add_rule_to_db(group=secgroup, name="icmp", from_port="-1", to_port="-1", protocol="icmp", cidr="0.0.0.0/0")
def define(self, name=None, **kwargs): """Define a hadoop stack. """ stackname = name or Default.generate_name(Names.STACK_COUNTER) # remove None to defer default definitions to latter for k in kwargs.keys(): if kwargs[k] is None: del kwargs[k] kwargs['local_path'] = os.path.join( os.path.expanduser('~/.cloudmesh/stacks'), stackname) try: spec = db.select(SPECIFICATION, name=stackname, type='stack')[0] spec.update(kwargs) db.updateObj(spec) except IndexError: spec = SPECIFICATION(stackname, 'stack', kwargs) db.insert(spec) Default.set_stack(stackname) Console.ok('Defined stack {}'.format(stackname))
def do_refresh(self, args, arguments): """ :: Usage: refresh on refresh off refresh [list] switches on and off the refresh for clouds """ if arguments["on"]: Default.set_refresh(True) Console.ok("Switch refresh on") elif arguments["off"]: Default.set_refresh(False) Console.ok("Switch refresh off") else: refresh = Default.refresh if refresh: msg = "on" else: msg = "off" Console.ok("Automatic cloud refresh is switched {}".format(msg)) return ""
def delete(self, clusternames=None, force=False, all=False): """Delete clusters that have these names. If not specified, delete the active cluster. If there is no active cluster, delete the first cluster. :param list clusternames: list of cluster names to delete """ if all: clusters = db.select(Cluster) else: clusternames = clusternames or [Default.cluster] clusters = [db.select(Cluster, name=name).one() for name in clusternames] for cluster in clusters: Console.ok('Deleting cluster {}'.format(cluster.name)) cluster.delete(force=force) Console.ok('Deleted cluster {}: {} nodes' .format(cluster.name, cluster.count)) remaining_clusters = db.select(Cluster).all() if remaining_clusters: name = remaining_clusters[-1].name else: name = None Default.set_cluster(name) Console.ok('Active cluster: {}'.format(name))
def boot(self, cloud=None, image=None, flavor=None, key=None, arguments=None): """ Boots the image on a specified cloud :param image: The name of the image :type image: str :param flavor: The name of the flavor :type flavor: str :param key: The name of the key :type key: str :param cloud: The name of the cloud :type cloud: str :param arguments: An array of arguments :type arguments: list of str :return: the id of the vm :rtype: str """ if cloud is None: cloud = Default.get("cloud", "general") print("get default cloud: " + str(cloud)) if image is None: image = Default.get("image", cloud) print("get default image ", str(image)) if flavor is None: flavor = Default.get("flavor", cloud) print("get default flavor ", str(flavor)) if key is None: key = Default.get("key", str(cloud)) print("get default key ", str(key)) # command_key print("boot an image", image, flavor, key, cloud, arguments) pass
def do_image(self, args, arguments): """ :: Usage: image refresh [--cloud=CLOUD] image list [ID] [--cloud=CLOUD] [--format=FORMAT] [--refresh] This lists out the images present for a cloud Options: --format=FORMAT the output format [default: table] --cloud=CLOUD the cloud name --refresh live data taken from the cloud Examples: cm image refresh cm image list cm image list --format=csv cm image list 58c9552c-8d93-42c0-9dea-5f48d90a3188 --refresh """ cloud = arguments["--cloud"] or Default.get_cloud() if cloud is None: Console.error("Default cloud doesn't exist") return if arguments["refresh"] or Default.refresh(): msg = "Refresh image for cloud {:}.".format(cloud) if Image.refresh(cloud): Console.ok("{:} ok.".format(msg)) else: Console.error("{:} failed.".format(msg)) return "" if arguments["list"]: id = arguments['ID'] live = arguments['--refresh'] output_format = arguments["--format"] counter = 0 result = None while counter < 2: if id is None: result = Image.list(cloud, output_format) else: result = Image.details(cloud, id, live, output_format) if counter == 0 and result is None: if not Image.refresh(cloud): msg = "Refresh image for cloud {:}.".format(cloud) Console.error("{:} failed.".format(msg)) counter += 1 if result is None: Console.error("No image(s) found. Failed.") else: print(result) return ""
def use(self, specname): """Activate the given specification :param specname: namne of the specification """ spec = db.select(SPECIFICATION, type='cluster', name=specname)[0] Default.set_specification(spec.name) Default.set_cluster(spec.name)
def test_001(self): """ delete defaults :return: """ HEADING() Default.clear() assert Default.list() == None
def __init__(self, context): self.context = context if self.context.debug: print("init command debug") try: value = Default.get_debug() except: Default.set_debug("off")
def __init__(self, context): self.context = context if self.context.debug: print("init command refresh") try: value = Default.get_refresh() except: Default.set_refresh("off")
def test_999(self): """ clear the defaults :return: """ HEADING() Default.clear() assert True
def test_004(self): """ set default flavor :return: """ HEADING() name = "myflavor" Default.set_flavor(name, "mycloud") assert Default.get_flavor("mycloud") == name self._check(name)
def test_006(self): """ set default key :return: """ HEADING() name = "mygroup" Default.set_group(name) assert Default.get_group() == name self._check(name)
def test_005(self): """ set default key :return: """ HEADING() name = "mykey" Default.set_key(name) assert Default.get_key() == name self._check(name)
def test_003(self): """ set default image :return: """ HEADING() name = "myimage" Default.set_image(name, "mycloud") assert Default.get_image("mycloud") == name self._check(name)
def test_003(self): HEADING("set default image") name = self.data.image print(self.data) Default.set_image(name, self.data.cloud) print(Default.get(name=name, category=self.data.cloud)) assert Default.get(name="image", category=self.data.cloud) == name
def boot_from_args(arg): arg.username = arg.username or Image.guess_username(arg.image) is_name_provided = arg.name is not None arg.user = Default.user for index in range(0, arg.count): vm_details = dotdict({ "cloud": arg.cloud, "name": Vm.get_vm_name(arg.name, index), "image": arg.image, "flavor": arg.flavor, "key": arg.key, "secgroup": arg.secgroup, "group": arg.group, "username": arg.username, "user": arg.user }) # correct the username vm_details.username = Image.guess_username_from_category( vm_details.cloud, vm_details.image, username=arg.username) try: if arg.dryrun: print(Printer.attribute(vm_details, output=arg.format)) msg = "dryrun info. OK." Console.ok(msg) else: vm_id = Vm.boot(**vm_details) if vm_id is None: msg = "info. failed." Console.error(msg, traceflag=False) return "" # set name and counter in defaults Default.set_vm(value=vm_details.name) if is_name_provided is False: Default.incr_counter("name") # Add to group if vm_id is not None: Group.add(name=vm_details.group, species="vm", member=vm_details.name, category=vm_details.cloud) msg = "info. OK." Console.ok(msg) except Exception as e: Console.error("Problem booting instance {name}".format(**vm_details), traceflag=False)
def boot_from_args(arg): arg.username = arg.username or Image.guess_username(arg.image) is_name_provided = arg.name is not None arg.user = Default.user for index in range(0, arg.count): vm_details = dotdict({ "cloud": arg.cloud, "name": Vm.generate_vm_name(arg.name, index), "image": arg.image, "flavor": arg.flavor, "key": arg.key, "secgroup": arg.secgroup, "group": arg.group, "username": arg.username, "user": arg.user }) # correct the username vm_details.username = Image.guess_username_from_category( vm_details.cloud, vm_details.image, username=arg.username) try: if arg.dryrun: print(Printer.attribute(vm_details, output=arg.format)) msg = "dryrun info. OK." Console.ok(msg) else: vm_id = Vm.boot(**vm_details) if vm_id is None: msg = "info. failed." Console.error(msg, traceflag=False) return "" # set name and counter in defaults Default.set_vm(value=vm_details.name) if is_name_provided is False: Default.incr_counter("name") # Add to group if vm_id is not None: Group.add(name=vm_details.group, species="vm", member=vm_details.name, category=vm_details.cloud) msg = "info. OK." Console.ok(msg) except Exception as e: Console.error( "Problem booting instance {name}".format(**vm_details), traceflag=False)
def test_007(self): """ set default variable :return: """ HEADING() name = "myvar" value = "myvalue" cloud = "mycloud" Default.set(name, value, cloud) assert Default.get(name, cloud) == value self._check(value)
def do_info(self, args, arguments): """ :: Usage: info [--cloud=CLOUD] [--format=FORMAT] Options: --format=FORMAT the output format [default: table] --cloud=CLOUD the cloud name Examples: cm info """ arg = dotdict(arguments) arg.cloud = arguments["--cloud"] or Default.cloud arg.FORMAT = arguments["--format"] or "table" d = { "cloud": arg.cloud, "key": Default.key, "user": Default.user, "vm": Default.vm, "group": Default.group, "secgroup": Default.secgroup, "counter": Default.get_counter(name="name"), "image": Default.get_image(category=arg.cloud), "flavor": Default.get_flavor(category=arg.cloud), "refresh": str(Default.refresh), "debug": str(Default.debug), "interactive": str(Default.interactive), "purge": str(Default.purge), } order = [ "cloud", "key", "user", "vm", "group", "secgroup", "counter", "image", "flavor", "refresh", "debug", "interactive", "purge" ] print( Printer.attribute(d, order=order, output=arg.FORMAT, sort_keys=False)) if d["key"] in ["TBD", ""] or d["user"] in ["TBD", ""]: msg = "Please replace the TBD values" msg = msg + "\nSee Also: \n\n" \ + " cm register profile \n" \ + " cm default user=YOURUSERNAME\n" Console.error(msg, traceflag=False) return ""
def test_004(self): print(Printer.write(self.cm.info())) m = Default.set_counter("index", 2) self.cm.add(m) o = Default.get_counter('index') print("OOO", o) Default.set_counter("index", 0) for i in range(0, 10): Default.incr_counter("index") print(Printer.write(self.cm.info())) c = self.cm.all(kind="default") print(Printer.write(c, order=['name', 'value', 'provider', 'type'])) print(Default.get_counter(name="index")) i = Default.get(name="index") assert type(i) == int assert i == 10 i = Default.index assert type(i) == int assert i == 10
def cloudmesh_cloud(request, cloud=None): if cloud is None: cloud = Default.get_cloud() config = ConfigDict(filename="cloudmesh.yaml") cloud_config = dict(config["cloudmesh.clouds"][cloud]) active = cloud in config["cloudmesh.active"] default = Default.get_cloud() if 'OS_PASSWORD' in cloud_config['credentials']: cloud_config['credentials']['OS_PASSWORD'] = '******' context = { 'data': cloud_config, 'title': "Cloud {cm_heading}".format(**cloud_config), } return render(request, 'cloudmesh_portal/cm/cloud_table.jinja', context)
def do_quota(self, args, arguments): """ :: Usage: quota list [--cloud=CLOUD] [--tenant=TENANT] [--format=FORMAT] Prints quota limit on a current project/tenant Options: --format=FORMAT the output format [default: table] --cloud=CLOUD the cloud name --tenant=TENANT the tenant id Examples: cm quota list cm quota list --cloud=india --format=csv """ if arguments["list"]: cloud = arguments["--cloud"] or Default.get_cloud() if not cloud: Console.error("Default cloud doesn't exist") return tenant = arguments["--tenant"] output_format = arguments["--format"] list_quotas = Quota.list(cloud, tenant, output=output_format) Console.msg(list_quotas) return
def cloudmesh_refresh(request, action=None, cloud=None): if action is None: action = ['image', 'flavor', 'vm'] else: action = [action] if cloud is None: cloud = Default.get_cloud() # TODO: should actually be all active clouds data = Vm.list(cloud=cloud, output_format='dict') print json.dumps(data, indent=4) order = ['id', 'uuid', 'label', 'status', 'static_ip', 'floating_ip', 'key_name', 'project', 'user', 'cloud'] return dict_table(request, title="Cloudmesh VMs {}".format(cloud), data=data, order=order)
def do_limits(self, args, arguments): """ :: Usage: limits list [--cloud=CLOUD] [--tenant=TENANT] [--format=FORMAT] Current list data with limits on a selected project/tenant. The --tenant option can be used by admin only Options: --format=FORMAT the output format [default: table] --cloud=CLOUD the cloud name --tenant=TENANT the tenant name Examples: cm limits list cm limits list --cloud=kilo --format=csv """ if arguments["list"]: cloud = arguments["--cloud"] or Default.get_cloud() if not cloud: Console.error("cloud doesn't exist") return "" output_format = arguments["--format"] tenant = arguments["--tenant"] result = Limits.list(cloud, output=output_format, tenant=tenant) Console.msg(result) return ""
def get_info(cls, category="kilo", name=None, output="table"): """ Method to get info about a group :param cloud: :param name: :param output: :return: """ try: cloud = category or Default.get("cloud") args = { "name": name, "category": category } # group = cls.get(name=name, category=cloud) group = cls.cm.find("group", output="object", **args).first() if group is not None: d = cls.to_dict(group) # Transform the dict to show multiple rows per vm newdict = Group.transform_dict(d) else: return None return dict_printer(newdict, order=cls.order, output=output) except Exception as ex: Console.error(ex.message, ex)
def get(prefix=None, idx=None, user=None): """Return a vm name to use next time. prefix or index can be given to update a vm name (optional) Args: prefix (str, optional): the name of prefix idx (int, str, optional): the index to increment. This can be a digit or arithmetic e.g. +5 or -3 can be used """ user = user or ConfigDict("cloudmesh.yaml")["cloudmesh.profile.user"] prefix = prefix or user if type(idx) is not int: idx = int(idx) Default.set('index', idx) return "%{:}_%{:}".format()
def cloudmesh_defaults(request): data = json.loads(Default.list(output='json')) print("RESULT DEFAULT",data) order = [ 'category', 'name', 'value', 'project', 'user', ] header = [ 'Category', 'Variable', 'Value', 'Project', 'User', ] return (dict_table(request, title="Cloudmesh Default", data=data, header=header, order=order))
def do_check(self, args, arguments): """ :: Usage: check --cloud=CLOUD check checks some elementary setting for cloudmesh Options: --format=FORMAT the output format [default: table] --cloud=CLOUD the cloud name Examples: cm check cm check --cloud=kilo """ cloud = arguments["--cloud"] or Default.get_cloud() if cloud is None: Console.error("Default cloud doesn't exist") print(locals()) Console.ok("{:} ok".format(cloud)) return ""
def do_info(self, args, arguments): """ :: Usage: info [--cloud=CLOUD] [--format=FORMAT] Options: --format=FORMAT the output format [default: table] --cloud=CLOUD the cloud name Examples: cm info """ arg = dotdict(arguments) arg.cloud = arguments["--cloud"] or Default.cloud arg.FORMAT = arguments["--format"] or "table" d = { "cloud": arg.cloud, "key": Default.key, "user": Default.user, "vm": Default.vm, "group": Default.group, "secgroup": Default.secgroup, "counter": Default.get_counter(name="name"), "image": Default.get_image(category=arg.cloud), "flavor": Default.get_flavor(category=arg.cloud), "refresh": str(Default.refresh), "debug": str(Default.debug), "interactive": str(Default.interactive), "purge": str(Default.purge), } order = ["cloud", "key", "user", "vm", "group", "secgroup", "counter", "image", "flavor", "refresh", "debug", "interactive", "purge"] print(Printer.attribute(d, order=order, output=arg.FORMAT, sort_keys=False)) if d["key"] in ["TBD", ""] or d["user"] in ["TBD", ""]: msg = "Please replace the TBD values" msg = msg + "\nSee Also: \n\n" \ + " cm register profile \n" \ + " cm default user=YOURUSERNAME\n" Console.error(msg, traceflag=False) return ""
def do_loglevel(self, args, arguments): """ :: Usage: loglevel set MODE [--cloud=CLOUD] loglevel get [--cloud=CLOUD] loglevel save [--cloud=CLOUD] Arguments: MODE log level mode [DEBUG/INFO/WARNING/CRITICAL/ERROR] Options: --cloud=CLOUD the name of the cloud Description: loglevel command sets the default logging level for a cloud. Examples: loglevel set DEBUG --cloud=kilo sets the default log level to DEBUG for kilo. loglevel get --cloud=kilo retreives the default log level for kilo cloud. loglevel save --cloud=kilo saves the log level preference to the db & yaml file. """ # pprint(arguments) cloud = arguments["--cloud"] or Default.get_cloud() LOGGER.info("Cloud: " + cloud + ", Arguments: " + str(arguments)) if arguments["set"]: try: log_level = arguments["MODE"] response = LogUtil.set_level(log_level=log_level, cloudname=cloud) if response is not None: Console.ok(response) except Exception as ex: Console.error(ex.message, ex) elif arguments["get"]: try: log_level = LogUtil.get_level(cloudname=cloud) Console.ok("Current Log Level = " + log_level + ". Ok.") except Exception as ex: Console.error(ex.message, ex) elif arguments["save"]: LogUtil.save(cloudname=cloud) pass