Esempio n. 1
0
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)
Esempio n. 2
0
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
Esempio n. 3
0
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))
Esempio n. 4
0
 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']
Esempio n. 5
0
 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']
Esempio n. 6
0
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()]
Esempio n. 7
0
 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']
Esempio n. 8
0
 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
Esempio n. 9
0
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
Esempio n. 10
0
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)
Esempio n. 11
0
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)
Esempio n. 12
0
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)
Esempio n. 13
0
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))
Esempio n. 14
0
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']))
Esempio n. 15
0
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)
Esempio n. 16
0
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
Esempio n. 17
0
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)
Esempio n. 18
0
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)

Esempio n. 19
0
    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)
Esempio n. 20
0
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():
Esempio n. 21
0
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:
Esempio n. 22
0
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'])
Esempio n. 23
0
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:
Esempio n. 24
0
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)
Esempio n. 25
0
# 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:
Esempio n. 26
0
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)
Esempio n. 27
0
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:"
Esempio n. 28
0
    '-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,