def action_update(): # Load config file config_filename = 'config/images/{}'.format(options.image_config) if not utils.file_exists(config_filename, logger): utils.sys_error( 'Could not find config file {}'.format(config_filename)) image_config = utils.load_config('config/images/{}'.format( options.image_config)) if 'images' not in image_config or 'type' not in image_config: utils.sys_error( 'Images hash not found in config file {}'.format(config_filename)) image_type = image_config['type'] for name, image_data in image_config['images'].iteritems(): if 'retired' in image_data and image_data['retired'] == 1: kc.debug_log('dropped {}: image retired'.format(name)) continue if options.name and name != options.name: kc.debug_log('dropped {}: image name spesified'.format(name)) continue if not bool(all(k in image_data for k in mandatory)): kc.debug_log( 'missing attributes in image hash for {}'.format(name)) continue update_image(name, image_data, image_type)
def action_retire(): image_templates = himutils.load_config('config/images/%s' % options.image_config) if not image_templates or 'images' not in image_templates or 'type' not in image_templates: sys.stderr.write("Invalid yaml file (config/images/%s): images hash not found\n" % options.image_config) sys.exit(1) image_type = image_templates['type'] image_msg = options.name if options.name else 'all' question = "Retire all active images matching '%s'" % image_msg if not himutils.confirm_action(question): return found = False for name, image_data in image_templates['images'].iteritems(): if options.name and name != options.name: logger.debug('=> dropped %s: image name spesified', name) continue tags = list() tags.append(image_type) tags.append(name) filters = {'tag': tags, 'status': 'active'} logger.debug('=> filter: %s' % filters) images = glclient.find_image(filters=filters, limit=1) if images and len(images) > 0: if not options.dry_run: timestamp = datetime.utcnow().replace(microsecond=0).isoformat() glclient.update_image(image_id=images[0]['id'], name=image_data['depricated'], depricated=timestamp) glclient.deactivate(image_id=images[0]['id']) found = True if not found: print 'No image found in %s' % options.image_config
def action_update(): dry_run_txt = 'DRY-RUN: ' if options.dry_run else '' defaults = himutils.load_config('config/quotas/%s' % options.quota_config, logger) if not defaults: himutils.sys_error('No default quotas found in config/quota/%s' % options.quota_config) for region in regions: novaclient = Nova(options.config, debug=options.debug, log=logger, region=region) cinderclient = Cinder(options.config, debug=options.debug, log=logger, region=region) components = {'nova': novaclient, 'cinder': cinderclient} for comp, client in components.iteritems(): if options.service != 'all' and comp != options.service: continue if comp not in defaults: logger.debug('=> could not find quota for %s in config' % comp) continue if hasattr(client, 'get_quota_class'): current = getattr(client, 'get_quota_class')() else: logger.debug('=> function get_quota_class not found for %s' % comp) continue if not isinstance(current, dict): current = current.to_dict() updates = dict() for k, v in defaults[comp].iteritems(): if k in current and current[k] != v: logger.debug("=> %sUpdated %s: from %s to %s in %s" % (dry_run_txt, k, current[k], v, region)) updates[k] = v if updates and not options.dry_run: result = getattr(client, 'update_quota_class')(updates=updates) logger.debug('=> %s' % result) elif not updates: logger.debug('=> no need to update default quota for %s in %s' % (comp, region))
def __autoload(self): """ Load parser config from yaml. """ parser_config = utils.load_config('config/parser/%s.yaml' % self.name) if 'desc' in parser_config: self.desc = parser_config['desc'] if 'actions' in parser_config: self.actions = parser_config['actions'] if 'opt_args' in parser_config: self.opt_args = parser_config['opt_args']
def load_config(): config_files = { 'blacklist': 'config/security_group/blacklist.yaml', 'whitelist': 'config/security_group/whitelist.yaml', 'notify': 'config/security_group/notify.yaml' } config = dict() for file_type, config_file in config_files.iteritems(): config[file_type] = utils.load_config(config_file) kc.debug_log('{}: {}'.format(file_type, config[file_type])) return [(v) for v in config.itervalues()]
def __autoload(self): """ Load parser config from yaml. """ config_file = 'config/parser/{}.yaml'.format(self.name) parser_config = utils.load_config(config_file) if not parser_config: msg = "Parser: not found {}".format(config_file) utils.sys_error(msg, 1) if 'desc' in parser_config: self.desc = parser_config['desc'] if 'actions' in parser_config: self.actions = parser_config['actions'] if 'opt_args' in parser_config: self.opt_args = parser_config['opt_args']
def __init__(self, config_path, ldap_config='config/ldap.yaml', debug=False, log=None): self.config = self.load_config(config_path) self.logger = utils.get_logger(__name__, self.config, debug, log) self.logger.debug('=> config file: {}'.format(self.config_path)) self.ldap_config = utils.load_config(ldap_config, self.logger) self.debug = debug self.dry_run = False self.org = None self.ldap = None
def get_flavor_config(region): # First look for region version of flavor config, then the default one if himutils.file_exists('config/flavors/%s-%s.yaml' % (options.flavor, region)): configfile = 'config/flavors/%s-%s.yaml' % (options.flavor, region) else: configfile = 'config/flavors/%s.yaml' % (options.flavor) kc.debug_log('use flavor config from %s' % configfile) flavors = himutils.load_config(configfile) if not flavors: himutils.sys_error( 'Could not find flavor config file config/flavors/%s.yaml' % options.flavor) return flavors
def get_valid_users(organization=None): whitelist = himutils.load_file('whitelist_users.txt', logger) if not whitelist: himutils.sys_error('Could not find whitelist_users.txt!') orgs = himutils.load_config('config/ldap.yaml', logger).keys() if organization and organization not in orgs: himutils.sys_error('Unknown org used: %s' % organization) ldap = dict() for o in orgs: ldap[o] = LdapClient(options.config, debug=options.debug, log=logger) ldap[o].bind(o) users = ksclient.list_users(domain=options.domain) deactive = list() active = dict() unknown = list() count = 0 for user in users: if user in whitelist: ksclient.debug_log('user %s in whitelist' % user) org = ksclient.get_user_org(user) # Drop users if organization is set if organization and org != organization: continue # Only add a user to deactive if user also enabled in OS os_user = ksclient.get_user_by_email(user, 'api') if not os_user.enabled: continue if options.limit and count >= int(options.limit): break count += 1 # user in valid org if org and org in orgs: if (not ldap[org].get_user(email=user, org=org) and user not in whitelist): deactive.append(user) # Sleep after a ldap search time.sleep(2) else: active[org] = active.setdefault(org, 0) + 1 else: if '@' in user: org = user.split("@")[1] if org not in unknown: unknown.append(org) total = 0 for k, v in active.iteritems(): total += v active['total'] = total return (active, deactive, unknown)
def action_update(): image_templates = himutils.load_config('config/images/%s' % options.image_config) if not image_templates or 'images' not in image_templates or 'type' not in image_templates: sys.stderr.write("Invalid yaml file (config/images/%s): images hash not found\n" % options.image_config) sys.exit(1) image_type = image_templates['type'] for name, image_data in image_templates['images'].iteritems(): if options.name and name != options.name: logger.debug('=> dropped %s: image name spesified', name) continue mandatory = ['latest', 'url', 'name', 'min_ram', 'min_disk', 'depricated'] if not bool(all(k in image_data for k in mandatory)): logger.debug('=> missing attributes in image hash for %s' % name) continue update_image(name, image_data, image_type)
def get_valid_users(): whitelist = himutils.load_file('whitelist_users.txt', logger) if not whitelist: himutils.sys_error('Could not find whitelist_users.txt!') orgs = himutils.load_config('config/ldap.yaml', logger).keys() ldap = dict() for org in orgs: ldap[org] = LdapClient(options.config, debug=options.debug, log=logger) ldap[org].bind(org) users = ksclient.list_users(domain=options.domain) deactive = list() active = dict() unknown = list() count = 0 for user in users: if options.limit and count >= int(options.limit): break count += 1 if user in whitelist: ksclient.debug_log('user %s in whitelist' % user) # Only add a user to deactive if user also enabled in OS os_user = ksclient.get_user_by_email(user, 'api') if not os_user.enabled: continue org_found = False for org in orgs: if not org in user: continue org_found = True if not ldap[org].get_user(user) and user not in whitelist: deactive.append(user) else: active[org] = active.setdefault(org, 0) + 1 break if not org_found: #print "%s org not found" % user if '@' in user: org = user.split("@")[1] if org not in unknown: unknown.append(org) time.sleep(2) total = 0 for k,v in active.iteritems(): total += v active['total'] = total return (active, deactive, unknown)
def action_update(): dry_run_txt = 'DRY-RUN: ' if options.dry_run else '' defaults = himutils.load_config('config/quotas/%s' % options.quota_config, logger) if not defaults: himutils.sys_error('No default quotas found in config/quota/%s' % options.quota_config) for region in regions: novaclient = Nova(options.config, debug=options.debug, log=logger, region=region) cinderclient = Cinder(options.config, debug=options.debug, log=logger, region=region) components = {'nova': novaclient, 'cinder': cinderclient} for comp, client in components.iteritems(): if options.service != 'all' and comp != options.service: continue if comp not in defaults: logger.debug('=> could not find quota for %s in config' % comp) continue if hasattr(client, 'get_quota_class'): current = getattr(client, 'get_quota_class')() else: logger.debug('=> function get_quota_class not found for %s' % comp) continue if not isinstance(current, dict): current = current.to_dict() updates = dict() for k, v in defaults[comp].iteritems(): if k in current and current[k] != v: logger.debug("=> %sUpdated %s: from %s to %s in %s" % (dry_run_txt, k, current[k], v, region)) updates[k] = v if updates and not options.dry_run: result = getattr(client, 'update_quota_class')(updates=updates) logger.debug('=> %s' % result) elif not updates: logger.debug( '=> no need to update default quota for %s in %s' % (comp, region))
def action_retire(): tags = get_tags(names=True) # Load config file config_filename = 'config/images/{}'.format(options.image_config) if not utils.file_exists(config_filename, logger): utils.sys_error( 'Could not find config file {}'.format(config_filename)) image_config = utils.load_config('config/images/{}'.format( options.image_config)) # make sure we have image type set if not 'type' in image_config: utils.sys_error( 'Type missing in retire file {}'.format(config_filename)) tags.append(image_config['type']) tag_str = 'all tags' if not tags else '[' + ', '.join(tags) + ']' if 'images' not in image_config or 'type' not in image_config: utils.sys_error( 'Images hash not found in config file {}'.format(config_filename)) if options.name not in image_config['images']: utils.sys_error( 'Unable to retire {}. Missing from config file {}'.format( options.name, options.image_config)) # Point of no return if not options.force and not utils.confirm_action( 'Retire active images matching {}'.format(tag_str)): return # Find image(s) filters = {'status': 'active', 'tag': tags} kc.debug_log('filter: {}'.format(filters)) images = gc.get_images(filters=filters, limit=1) for image in images: new_name = image_config['images'][options.name]['depricated'] timestamp = datetime.utcnow().replace(microsecond=0).isoformat() gc.update_image(image_id=image['id'], name=new_name, depricated=timestamp) gc.deactivate(image_id=image['id']) printer.output_msg('Retire image {}'.format(image['name']))
def action_update(): image_templates = himutils.load_config('config/images/%s' % options.image_config) if not image_templates or 'images' not in image_templates or 'type' not in image_templates: sys.stderr.write( "Invalid yaml file (config/images/%s): images hash not found\n" % options.image_config) sys.exit(1) image_type = image_templates['type'] for name, image_data in image_templates['images'].iteritems(): if options.name and name != options.name: logger.debug('=> dropped %s: image name spesified', name) continue mandatory = [ 'latest', 'url', 'name', 'min_ram', 'min_disk', 'depricated' ] if not bool(all(k in image_data for k in mandatory)): logger.debug('=> missing attributes in image hash for %s' % name) continue update_image(name, image_data, image_type)
from himlarcli.keystone import Keystone #import himlarcli.foremanclient as foreman from himlarcli.foremanclient import Client from himlarcli import utils as himutils desc = 'Setup compute resources and profiles' options = utils.get_options(desc, hosts=False, dry_run=True) keystone = Keystone(options.config, debug=options.debug) logger = keystone.get_logger() domain = keystone.get_config('openstack', 'domain') client = Client(options.config, options.debug, log=logger) foreman = client.get_client() # Add compute resources resource_config = himutils.load_config('config/compute_resources.yaml') if keystone.region not in resource_config: num_resources = resource_config['default']['num_resources'] else: num_resources = resource_config[keystone.region]['num_resources'] logger.debug("=> number of compute resources for %s: %s" % (keystone.region, num_resources)) resources = foreman.index_computeresources() found_resources = dict({}) for r in resources['results']: found_resources[r['name']] = r['id'] for x in range(1, (num_resources + 1)): name = '%s-controller-0%s' % (keystone.region, x) resource = dict() resource['name'] = name
def action_create(): if not ksclient.is_valid_user(options.admin, options.domain) and options.type == 'personal': himutils.sys_error('not valid user', 1) quota = himutils.load_config('config/quotas/%s.yaml' % options.quota) if options.quota and not quota: himutils.sys_error('Could not find quota in config/quotas/%s.yaml' % options.quota) test = 1 if options.type == 'test' else 0 if options.enddate: try: enddate = datetime.strptime(options.enddate, '%d.%m.%Y').date() except ValueError: himutils.sys_error('date format DD.MM.YYYY not valid for %s' % options.enddate, 1) else: enddate = None createdate = datetime.today() if not options.force: print 'Project name: %s\nAdmin: %s\nType: %s\nEnd date: %s\nQuota: %s\nRT: %s' \ % (options.project, options.admin.lower(), options.type, str(enddate), options.quota, options.rt) if not himutils.confirm_action('Are you sure you want to create this project?'): himutils.sys_error('Aborted', 1) project = ksclient.create_project(project_name=options.project, admin=options.admin.lower(), test=test, type=options.type, description=options.desc, enddate=str(enddate), createdate=createdate.isoformat(), quota=options.quota, rt=options.rt) if not ksclient.is_valid_user(options.admin, options.domain): himutils.sys_error('WARNING: "%s" is not a valid user.' % options.admin, 0) if not project: himutils.sys_error('Failed creating %s' % options.project, 1) else: output = Keystone.get_dict(project) output['header'] = "Show information for %s" % options.project printer.output_dict(output) # Quotas for region in regions: novaclient = Nova(options.config, debug=options.debug, log=logger, region=region) cinderclient = Cinder(options.config, debug=options.debug, log=logger, region=region) neutronclient = Neutron(options.config, debug=options.debug, log=logger, region=region) cinderclient.set_dry_run(options.dry_run) novaclient.set_dry_run(options.dry_run) neutronclient.set_dry_run(options.dry_run) project_id = Keystone.get_attr(project, 'id') if quota and 'cinder' in quota and project: cinderclient.update_quota(project_id=project_id, updates=quota['cinder']) if quota and 'nova' in quota and project: novaclient.update_quota(project_id=project_id, updates=quota['nova']) if quota and 'neutron' in quota and project: neutronclient.update_quota(project_id=project_id, updates=quota['neutron']) if options.mail: mail = Mail(options.config, debug=options.debug) mail.set_dry_run(options.dry_run) if options.rt is None: himutils.sys_error('--rt parameter is missing.') else: mapping = dict(project_name=options.project, admin=options.admin.lower(), quota=options.quota, end_date=str(enddate)) subject = 'UH-IaaS: Project %s has been created' % options.project body_content = himutils.load_template(inputfile=project_msg_file, mapping=mapping) if not body_content: himutils.sys_error('ERROR! Could not find and parse mail body in \ %s' % options.msg) mime = mail.rt_mail(options.rt, subject, body_content) mail.send_mail('*****@*****.**', mime)
from himlarcli.parser import Parser from himlarcli.printer import Printer from himlarcli import utils as himutils from himlarcli.notify import Notify himutils.is_virtual_env() parser = Parser() options = parser.parse_args() ksclient = Keystone(options.config, debug=options.debug) logger = ksclient.get_logger() printer = Printer(options.format) # Project type project_types = himutils.load_config('config/type.yaml', log=logger) if options.type and options.type not in project_types['types']: sys.stderr.write("Project type %s not valid. See config/type.yaml\n" % options.type) sys.exit(1) # Region regions = list() if options.region: regions = regions.append(options.region) else: for region in ksclient.get_regions(): regions.append(region.id) logger.debug('=> active regions: %s' % regions)
for flavor in flavors: #print flavor.__dict__.keys() if not getattr(flavor, 'OS-FLV-DISABLED:disabled'): public = 'public' if getattr( flavor, 'os-flavor-access:is_public') else 'not public' print '------------------------' print '%s (%s):' % (flavor.name, public) print 'ram: %s' % flavor.ram print 'vcpus: %s' % flavor.vcpus print 'disk: %s' % flavor.disk else: print '------------------------' print '%s is disabled!' % flavor.name #pp.pprint(flavor.to_dict()) elif options.action[0] == 'update': flavors = himutils.load_config('config/flavors/%s.yaml' % options.name, logger) if not flavors: print 'ERROR! No flavors found in config/flavors/%s.yaml' % options.name sys.exit(1) print 'Update %s flavors' % options.name public = flavors['public'] if 'public' in flavors else False for name, spec in sorted(flavors[options.name].iteritems()): novaclient.update_flavor(name, spec, public, options.dry_run) elif options.action[0] == 'purge': flavors = himutils.load_config('config/flavors/%s.yaml' % options.name, logger) if not flavors: print 'ERROR! No flavors found in config/flavors/%s.yaml' % options.name sys.exit(1) print 'Purge %s flavors' % options.name novaclient.purge_flavors(options.name, flavors, options.dry_run)
from himlarcli import utils as himutils from himlarcli.notify import Notify # OPS! It might need some updates. We use class Mail instead of Notify now. himutils.is_virtual_env() parser = Parser() options = parser.parse_args() ksclient = Keystone(options.config, debug=options.debug) logger = ksclient.get_logger() printer = Printer(options.format) # Project type project_types = himutils.load_config('config/type.yaml', log=logger) if options.type and options.type not in project_types['types']: sys.stderr.write("Project type %s not valid. See config/type.yaml\n" % options.type) sys.exit(1) # Region regions = list() if options.region: regions = regions.append(options.region) else: for region in ksclient.get_regions(): regions.append(region.id) logger.debug('=> active regions: %s' % regions) def action_list():
from himlarcli.sensu import Sensu #from himlarcli.printer import Printer himutils.is_virtual_env() # Load parser config from config/parser/* parser = Parser() options = parser.parse_args() client = ForemanClient(options.config, options.debug) region = client.get_config('openstack', 'region') logger = client.get_logger() sensu = Sensu(options.config, debug=options.debug) # Load node config node_config = himutils.load_config('config/nodes/%s.yaml' % region) if not node_config: node_config = himutils.load_config('config/nodes/default.yaml') nodes = node_config['nodes'] def action_show(): node_name = '%s-%s' % (region, options.node) node = client.get_host(node_name) pp = pprint.PrettyPrinter(indent=2) pp.pprint(node) def action_list(): count = dict() print "These nodes can be intalled:" for name, node in sorted(nodes.iteritems()): if 'compute_resource' in node:
def action_create(): quota = himutils.load_config('config/quotas/%s.yaml' % options.quota) if options.quota and not quota: himutils.sys_error('Could not find quota in config/quotas/%s.yaml' % options.quota) test = 1 if options.type == 'test' else 0 if options.enddate: try: enddate = datetime.strptime(options.enddate, '%d.%m.%y').date() except ValueError: himutils.sys_error( 'date format DD.MM.YY not valid for %s' % options.enddate, 1) else: enddate = None createdate = datetime.today() project = ksclient.create_project(domain=options.domain, project_name=options.project, admin=options.admin.lower(), test=test, type=options.type, description=options.desc, enddate=str(enddate), createdate=createdate.isoformat(), quota=options.quota) if project: output = project.to_dict() if not isinstance(project, dict) else project output['header'] = "Show information for %s" % options.project printer.output_dict(output) # Quotas for region in regions: novaclient = Nova(options.config, debug=options.debug, log=logger, region=region) cinderclient = Cinder(options.config, debug=options.debug, log=logger, region=region) neutronclient = Neutron(options.config, debug=options.debug, log=logger, region=region) cinderclient.set_dry_run(options.dry_run) novaclient.set_dry_run(options.dry_run) neutronclient.set_dry_run(options.dry_run) if project and not isinstance(project, dict): project_id = project.id elif project and isinstance(project, dict) and 'id' in project: project_id = project['id'] else: project_id = None if quota and 'cinder' in quota and project: cinderclient.update_quota(project_id=project_id, updates=quota['cinder']) if quota and 'nova' in quota and project: novaclient.update_quota(project_id=project_id, updates=quota['nova']) if quota and 'neutron' in quota and project: neutronclient.update_quota(project_id=project_id, updates=quota['neutron'])
import urllib import urllib2 import pprint from datetime import datetime import utils from himlarcli import utils as himutils from himlarcli.glance import Glance print "Depricated! Use image.py" sys.exit(0) options = utils.get_options('Create and update golden images', hosts=0, dry_run=True) glclient = Glance(options.config, debug=options.debug) logger = glclient.get_logger() golden_images = himutils.load_config('config/golden_images.yaml') if glclient.region in golden_images: images = golden_images[glclient.region] else: if not 'default' in golden_images: print "Missing default in config/golden_images.yaml" sys.exit(1) images = golden_images['default'] def download_and_check(image): source = himutils.get_abs_path('%s' % image['latest']) url = '%s%s' % (image['url'], image['latest']) # Do not redownload if not os.path.isfile(source): (filename, headers) = urllib.urlretrieve(url, source) if int(headers['content-length']) < 1000:
options = parser.parse_args() printer = Printer(options.format) kc= Keystone(options.config, debug=options.debug) kc.set_domain(options.domain) kc.set_dry_run(options.dry_run) logger = kc.get_logger() # Region if hasattr(options, 'region'): regions = kc.find_regions(region_name=options.region) else: regions = kc.find_regions() # Flavors flavors = himutils.load_config('config/flavors/%s.yaml' % options.flavor, logger) if not flavors: himutils.sys_error('Could not find flavor config file config/flavors/%s.yaml' % options.flavor) def action_list(): for region in regions: nc = Nova(options.config, debug=options.debug, log=logger, region=region) flavors = nc.get_flavors(filters=options.flavor) outputs = ['name', 'vcpus', 'ram', 'disk'] header = 'flavors in %s (%s)' % (region, ', '.join(outputs)) printer.output_dict({'header': header}) for flavor in flavors: output = OrderedDict() for out in outputs: output[out] = getattr(flavor, out)
# partition-table-id $norcams_ptable_id # subnet-id $foreman_subnet_id # puppet-proxy-id $foreman_proxy_id # puppet-ca-proxy-id $foreman_proxy_id # environment production # create storage hostgroup # parent base # parameter installdevice <config value> # create compute hosgroup # parent base # parameter installdevice <config value> # Add compute resources resource_config = himutils.load_config('config/compute_resources.yaml') if keystone.region not in resource_config: num_resources = resource_config['default']['num_resources'] else: num_resources = resource_config[keystone.region]['num_resources'] logger.debug("=> number of compute resources for %s: %s" % (keystone.region, num_resources)) found_resources = foreman.get_compute_resources() for x in range(1, (num_resources+1)): name = '%s-controller-0%s' % (keystone.region, x) resource = dict() resource['name'] = name resource['provider'] = 'Libvirt' resource['set_console_password'] = 0 resource['url'] = 'qemu+tcp://%s.%s:16509/system' % (name, domain) if name not in found_resources:
def action_create(): if not ksclient.is_valid_user( options.admin, options.domain) and options.type == 'personal': himutils.sys_error('not valid user', 1) quota = himutils.load_config('config/quotas/%s.yaml' % options.quota) if options.quota and not quota: himutils.sys_error('Could not find quota in config/quotas/%s.yaml' % options.quota) test = 1 if options.type == 'test' else 0 project_msg = project_msg_file enddate = himutils.get_date(options.enddate, None, '%d.%m.%Y') if options.type == 'hpc': project_msg = project_hpc_msg_file if not enddate: himutils.sys_error('HPC projects must have an enddate', 1) createdate = datetime.today() # Parse the "contact" option, setting to None if not used # Exit with error if contact is not a valid email address contact = None if options.contact is not None: contact = options.contact.lower() if not ksclient._Keystone__validate_email(contact): errmsg = "%s is not a valid email address." % contact himutils.sys_error(errmsg, 1) if not options.force: print 'Project name: %s\nDescription: %s\nAdmin: %s\nContact: %s\nOrganization: %s\nType: %s\nEnd date: %s\nQuota: %s\nRT: %s' \ % (options.project, ksclient.convert_ascii(options.desc), options.admin.lower(), contact, options.org, options.type, str(enddate), options.quota, options.rt) if not himutils.confirm_action( 'Are you sure you want to create this project?'): himutils.sys_error('Aborted', 1) project = ksclient.create_project(project_name=options.project, admin=options.admin.lower(), contact=contact, org=options.org, test=test, type=options.type, description=options.desc, enddate=str(enddate), createdate=createdate.isoformat(), quota=options.quota, rt=options.rt) if not ksclient.is_valid_user(options.admin, options.domain): himutils.sys_error( 'WARNING: "%s" is not a valid user.' % options.admin, 0) if not project: himutils.sys_error('Failed creating %s' % options.project, 1) else: output = Keystone.get_dict(project) output['header'] = "Show information for %s" % options.project printer.output_dict(output) # Do stuff for regions for region in regions: # Get objects novaclient = himutils.get_client(Nova, options, logger, region) cinderclient = himutils.get_client(Cinder, options, logger, region) neutronclient = himutils.get_client(Neutron, options, logger, region) glanceclient = himutils.get_client(Glance, options, logger, region) # Find the project ID project_id = Keystone.get_attr(project, 'id') # Update quotas for Cinder, Nova, Neutron if quota and 'cinder' in quota and project: cinderclient.update_quota(project_id=project_id, updates=quota['cinder']) if quota and 'nova' in quota and project: novaclient.update_quota(project_id=project_id, updates=quota['nova']) if quota and 'neutron' in quota and project: neutronclient.update_quota(project_id=project_id, updates=quota['neutron']) # Grant UiO Managed images if shared UiO project if options.org == 'uio' and options.type not in ['personal', 'demo']: tags = ['uio'] filters = {'status': 'active', 'tag': tags, 'visibility': 'shared'} images = glanceclient.get_images(filters=filters) for image in images: glanceclient.set_image_access(image_id=image.id, project_id=project.id, action='grant') printer.output_msg( 'GRANT access to image {} for project {}'.format( image.name, project.name)) if options.mail: mail = Mail(options.config, debug=options.debug) mail.set_dry_run(options.dry_run) if options.rt is None: himutils.sys_error('--rt parameter is missing.') else: mapping = dict(project_name=options.project, admin=options.admin.lower(), quota=options.quota, end_date=str(enddate)) subject = 'NREC: Project %s has been created' % options.project body_content = himutils.load_template(inputfile=project_msg, mapping=mapping) if not body_content: himutils.sys_error('ERROR! Could not find and parse mail body in \ %s' % options.msg) mime = mail.rt_mail(options.rt, subject, body_content) mail.send_mail('*****@*****.**', mime)
from himlarcli.foremanclient import Client from himlarcli.parser import Parser #from himlarcli.printer import Printer himutils.is_virtual_env() # Load parser config from config/parser/* parser = Parser() options = parser.parse_args() client = Client(options.config, options.debug) region = client.get_config('openstack', 'region') logger = client.get_logger() # Load node config node_config = himutils.load_config('config/nodes/%s.yaml' % region) if not node_config: node_config = himutils.load_config('config/nodes/default.yaml') nodes = node_config['nodes'] def action_show(): node_name = '%s-%s' % (region, options.node) node = client.get_host(node_name) pp = pprint.PrettyPrinter(indent=2) pp.pprint(node) def action_list(): count = dict() print "These nodes can be intalled:"
'-f': { 'dest': 'file', 'help': 'file with students', 'metavar': 'file' } } options = utils.get_action_options(desc, actions, dry_run=True, opt_args=opt_args) ksclient = Keystone(options.config, debug=options.debug) novaclient = Nova(options.config, debug=options.debug, log=ksclient.get_logger()) quota = himutils.load_config('config/quota.yaml', log=ksclient.get_logger()) project_types = himutils.load_config('config/type.yaml', log=ksclient.get_logger()) domain = 'Dataporten' if options.action[0] == 'create': if options.user and options.file: if not ksclient.is_valid_user(user=options.user, domain=domain): print "ERROR! %s is not a valid user." % options.user sys.exit(1) students = himutils.load_file(options.file, log=ksclient.get_logger()) pp = pprint.PrettyPrinter(indent=1) # Create owner project project_name = '%s-%s' % (options.name, options.user.lower()) if not options.dry_run: project = ksclient.create_project(domain=domain,