def do_plan_scale(tuskar, args, outfile=sys.stdout):
    """Scale plan by changing count of roles."""
    roles = tuskar.roles.list()
    plan = utils.find_resource(tuskar.plans, args.plan_uuid)
    attributes = []

    for role in roles:
        versioned_name = "{name}-{v}".format(name=role.name, v=role.version)
        if versioned_name == args.role_name:
            role_name_key = versioned_name + "::count"
            attributes.append({'name': role_name_key, 'value': args.count})
            old_val = [
                p['value'] for p in plan.parameters
                if p['name'] == role_name_key
            ][0]

            if old_val != args.count:
                print("Scaling {role} count: {old_val} -> {new_val}".format(
                    role=args.role_name, old_val=old_val, new_val=args.count),
                      file=outfile)
            else:
                print("Keeping scale {role} count: {count}".format(
                    role=args.role_name, count=old_val),
                      file=outfile)
                return

    if attributes:
        return tuskar.plans.patch(args.plan_uuid, attributes)
    else:
        print(
            "ERROR: no roles were found in the Plan with the name {0}".format(
                args.role_name),
            file=sys.stderr)
Example #2
0
def do_plan_scale(tuskar, args, outfile=sys.stdout):
    """Scale plan by changing count of roles."""
    roles = tuskar.roles.list()
    plan = utils.find_resource(tuskar.plans, args.plan_uuid)
    attributes = []

    for role in roles:
        versioned_name = "{name}-{v}".format(name=role.name, v=role.version)
        if versioned_name == args.role_name:
            role_name_key = versioned_name + "::count"
            attributes.append({'name': role_name_key,
                               'value': args.count})
            old_val = [p['value'] for p in plan.parameters
                       if p['name'] == role_name_key][0]

            if old_val != args.count:
                print("Scaling {role} count: {old_val} -> {new_val}".format(
                      role=args.role_name, old_val=old_val, new_val=args.count
                      ), file=outfile)
            else:
                print("Keeping scale {role} count: {count}".format(
                      role=args.role_name, count=old_val), file=outfile)
                return

    if attributes:
        return tuskar.plans.patch(args.plan_uuid, attributes)
    else:
        print("ERROR: no roles were found in the Plan with the name {0}".
              format(args.role_name), file=sys.stderr)
Example #3
0
def do_plan_flavor(tuskar, args, outfile=sys.stdout):
    """Change flavor of role in the plan."""
    roles = tuskar.roles.list()
    plan = utils.find_resource(tuskar.plans, args.plan_uuid)
    attributes = []

    for role in roles:
        versioned_name = "{name}-{v}".format(name=role.name, v=role.version)
        if versioned_name == args.role_name:
            role_name_key = versioned_name + "::Flavor"
            attributes.append({'name': role_name_key,
                               'value': args.flavor})
            old_val = [p['value'] for p in plan.parameters
                       if p['name'] == role_name_key][0]

            if old_val != args.flavor:
                print("Changing {role} flavor: {old_val} -> {new_val}".format(
                      role=args.role_name, old_val=old_val, new_val=args.flavor
                      ), file=outfile)
            else:
                print("Keeping flavor {role} unchanged: {flavor}".format(
                      role=args.role_name, flavor=old_val), file=outfile)
                return

    if attributes:
        return tuskar.plans.patch(args.plan_uuid, attributes)
    else:
        print("ERROR: no roles were found in the Plan with the name {0}".
              format(args.role_name), file=sys.stderr)
def do_plan_flavor(tuskar, args, outfile=sys.stdout):
    """Change flavor of role in the plan."""
    roles = tuskar.roles.list()
    plan = utils.find_resource(tuskar.plans, args.plan_uuid)
    attributes = []

    for role in roles:
        versioned_name = "{name}-{v}".format(name=role.name, v=role.version)
        if versioned_name == args.role_name:
            role_name_key = versioned_name + "::Flavor"
            attributes.append({'name': role_name_key, 'value': args.flavor})
            old_val = [
                p['value'] for p in plan.parameters
                if p['name'] == role_name_key
            ][0]

            if old_val != args.flavor:
                print("Changing {role} flavor: {old_val} -> {new_val}".format(
                    role=args.role_name, old_val=old_val, new_val=args.flavor),
                      file=outfile)
            else:
                print("Keeping flavor {role} unchanged: {flavor}".format(
                    role=args.role_name, flavor=old_val),
                      file=outfile)
                return

    if attributes:
        return tuskar.plans.patch(args.plan_uuid, attributes)
    else:
        print(
            "ERROR: no roles were found in the Plan with the name {0}".format(
                args.role_name),
            file=sys.stderr)
def do_overcloud_update(tuskar, args, outfile=sys.stdout):
    """Update an existing Overcloud by its ID or name."""
    overcloud = utils.find_resource(tuskar.overclouds, args.overcloud)
    overcloud_roles = tuskar.overcloud_roles.list()
    overcloud_dict = create_overcloud_dict(args, overcloud_roles)
    updated_overcloud = tuskar.overclouds.update(overcloud.id,
                                                 **overcloud_dict)
    print_overcloud_detail(updated_overcloud, outfile=outfile)
def do_overcloud_role_update(tuskar, args, outfile=sys.stdout):
    """Update an existing Overcloud Role by its ID or name."""
    overcloud_role = utils.find_resource(tuskar.overcloud_roles, args.role)
    overcloud_role_dict = create_overcloud_role_dict(args)
    updated_overcloud_role = tuskar.overcloud_roles.update(
        overcloud_role.id,
        **overcloud_role_dict
    )
    print_role_detail(updated_overcloud_role, outfile=outfile)
Example #7
0
 def __init__(self, heatclient, stack_id, tuskarclient=None, plan_id=None,
              tht_dir=None, environment_files=None):
     self.tuskarclient = tuskarclient
     self.heatclient = heatclient
     self.stack_id = stack_id
     self.tht_dir = tht_dir
     self.environment_files = environment_files
     if self.tuskarclient:
         self.plan = tuskarutils.find_resource(self.tuskarclient.plans,
                                               plan_id)
Example #8
0
 def __init__(self, heatclient, novaclient, stack_id, tuskarclient=None,
              plan_id=None, tht_dir=None, environment_files=None):
     stack = heatclient.stacks.get(stack_id)
     self.tuskarclient = tuskarclient
     self.plan_id = plan_id
     self.tht_dir = tht_dir
     self.hook_resource = 'UpdateDeployment'
     if self.tuskarclient:
         self.plan = tuskarutils.find_resource(self.tuskarclient.plans,
                                               self.plan_id)
     self.environment_files = environment_files
     super(PackageUpdateManager, self).__init__(
         heatclient=heatclient, novaclient=novaclient, stack=stack,
         hook_type='pre-update', nested_depth=5,
         hook_resource=self.hook_resource)
Example #9
0
def do_rack_show(tuskar, args):
    try:
        rack = utils.find_resource(tuskar.racks, args.id)
    except exc.HTTPNotFound:
        raise exc.CommandError("Rack not found: %s" % args.id)
    formatters = {
        'capacities': fmt.capacities_formatter,
        'chassis': fmt.resource_link_formatter,
        'links': fmt.links_formatter,
        'nodes': fmt.resource_links_formatter,
        'resource_class': fmt.resource_link_formatter,
    }

    rack_dict = rack.to_dict()
    # Workaround for API inconsistency, where empty chassis link
    # prints out as '{}'.
    if 'chassis' in rack_dict and not rack_dict['chassis']:
        del rack_dict['chassis']

    fmt.print_dict(rack_dict, formatters)
Example #10
0
 def __init__(self, heatclient, tuskarclient, stack_id, plan_id=None):
     self.tuskarclient = tuskarclient
     self.heatclient = heatclient
     self.stack = heatclient.stacks.get(stack_id)
     self.plan = tuskarutils.find_resource(self.tuskarclient.plans, plan_id)
Example #11
0
 def __init__(self, tuskarclient, heatclient, plan_id=None, stack_id=None):
     self.tuskarclient = tuskarclient
     self.heatclient = heatclient
     self.stack_id = stack_id
     self.plan = tuskarutils.find_resource(self.tuskarclient.plans, plan_id)
Example #12
0
    def _deploy_tuskar(self, stack, parsed_args):

        clients = self.app.client_manager
        management = clients.rdomanager_oscplugin.management()
        network_client = clients.network

        # TODO(dmatthews): The Tuskar client has very similar code to this for
        # downloading templates. It should be refactored upstream so we can use
        # it.

        if parsed_args.output_dir:
            output_dir = parsed_args.output_dir
        else:
            output_dir = tempfile.mkdtemp()

        if not os.path.isdir(output_dir):
            os.mkdir(output_dir)

        management_plan = tuskarutils.find_resource(management.plans,
                                                    parsed_args.plan)

        # retrieve templates
        templates = management.plans.templates(management_plan.uuid)

        parameters = self._update_paramaters(parsed_args, network_client,
                                             stack)

        if stack is None:
            ca_key_pem, ca_cert_pem = keystone_pki.create_ca_pair()
            signing_key_pem, signing_cert_pem = (
                keystone_pki.create_signing_pair(ca_key_pem, ca_cert_pem))
            parameters['Controller-1::KeystoneCACertificate'] = ca_cert_pem
            parameters['Controller-1::KeystoneSigningCertificate'] = (
                signing_cert_pem)
            parameters['Controller-1::KeystoneSigningKey'] = signing_key_pem

        # Save the parameters to Tuskar so they can be used when redeploying.
        # Tuskar expects to get all values as strings. So we convert them all
        # below.
        management.plans.patch(management_plan.uuid,
                               [{
                                   'name': x[0],
                                   'value': six.text_type(x[1])
                               } for x in parameters.items()])

        # write file for each key-value in templates
        print("The following templates will be written:")
        for template_name, template_content in templates.items():

            # It's possible to organize the role templates and their dependent
            # files into directories, in which case the template_name will
            # carry the directory information. If that's the case, first
            # create the directory structure (if it hasn't already been
            # created by another file in the templates list).
            template_dir = os.path.dirname(template_name)
            output_template_dir = os.path.join(output_dir, template_dir)
            if template_dir and not os.path.exists(output_template_dir):
                os.makedirs(output_template_dir)

            filename = os.path.join(output_dir, template_name)
            with open(filename, 'w+') as template_file:
                template_file.write(template_content)
            print(filename)

        overcloud_yaml = os.path.join(output_dir, 'plan.yaml')
        environment_yaml = os.path.join(output_dir, 'environment.yaml')
        environments = [
            environment_yaml,
        ]
        if parsed_args.rhel_reg:
            reg_env = self._create_registration_env(parsed_args)
            environments.extend(reg_env)
        if parsed_args.environment_files:
            environments.extend(parsed_args.environment_files)

        self._heat_deploy(stack, overcloud_yaml, parameters, environments,
                          parsed_args.timeout)
def do_plan_delete(tuskar, args, outfile=sys.stdout):
    """Delete an plan by its UUID."""
    plan = utils.find_resource(tuskar.plans, args.plan)
    tuskar.plans.delete(plan.uuid)
    print(u'Deleted Plan "%s".' % plan.name, file=outfile)
def do_plan_show_flavors(tuskar, args, outfile=sys.stdout):
    """Show flavors assigned to roles of Plan."""
    plan = utils.find_resource(tuskar.plans, args.plan)
    flavors = filter_parameters_to_dict(plan.parameters, 'Flavor')
    fmt.print_dict(flavors, outfile=outfile)
Example #15
0
def do_plan_delete(tuskar, args, outfile=sys.stdout):
    """Delete an plan by its UUID."""
    plan = utils.find_resource(tuskar.plans, args.plan)
    tuskar.plans.delete(plan.uuid)
    print(u'Deleted Plan "%s".' % plan.name, file=outfile)
def do_overcloud_delete(tuskar, args, outfile=sys.stdout):
    """Delete an Overcloud by its ID or name."""
    overcloud = utils.find_resource(tuskar.overclouds, args.overcloud)
    tuskar.overclouds.delete(overcloud.id)
    print(u'Deleted Overcloud "%s".' % overcloud.name, file=outfile)
def do_overcloud_show(tuskar, args, outfile=sys.stdout):
    """Show an individual Overcloud by its ID or name."""
    overcloud = utils.find_resource(tuskar.overclouds, args.overcloud)
    print_overcloud_detail(overcloud, outfile=outfile)
 def test_with_name(self):
     overcloud = utils.find_resource(self.manager, 'My Overcloud 1')
     self.assertEqual(self.overcloud1, overcloud)
 def test_with_id(self):
     overcloud = utils.find_resource(self.manager, '1')
     self.manager.get.assert_called_with(1)
     self.assertEqual(self.overcloud1, overcloud)
Example #20
0
 def __init__(self, heatclient, tuskarclient, stack_id, plan_id=None):
     self.tuskarclient = tuskarclient
     self.heatclient = heatclient
     self.stack = heatclient.stacks.get(stack_id)
     self.plan = tuskarutils.find_resource(self.tuskarclient.plans, plan_id)
Example #21
0
def do_plan_show_scale(tuskar, args, outfile=sys.stdout):
    """Show scale counts of Plan."""
    plan = utils.find_resource(tuskar.plans, args.plan)
    scales = filter_parameters_to_dict(plan.parameters, 'count')
    fmt.print_dict(scales, outfile=outfile)
def do_overcloud_role_delete(tuskar, args, outfile=sys.stdout):
    """Delete an Overcloud Role by its ID or name."""
    overcloud_role = utils.find_resource(tuskar.overcloud_roles, args.role)
    tuskar.overcloud_roles.delete(overcloud_role.id)
    print(u'Deleted Overcloud Role "%s".' % overcloud_role.name, file=outfile)
Example #23
0
def do_plan_show(tuskar, args, outfile=sys.stdout):
    """Show an individual Plan by its UUID."""
    plan = utils.find_resource(tuskar.plans, args.plan)
    print_plan_detail(plan, outfile=outfile)
def do_plan_show(tuskar, args, outfile=sys.stdout):
    """Show an individual Plan by its UUID."""
    plan = utils.find_resource(tuskar.plans, args.plan)
    print_plan_detail(plan, outfile=outfile)
Example #25
0
def do_plan_show_flavors(tuskar, args, outfile=sys.stdout):
    """Show flavors assigned to roles of Plan."""
    plan = utils.find_resource(tuskar.plans, args.plan)
    flavors = filter_parameters_to_dict(plan.parameters, 'Flavor')
    fmt.print_dict(flavors, outfile=outfile)
def do_plan_show_scale(tuskar, args, outfile=sys.stdout):
    """Show scale counts of Plan."""
    plan = utils.find_resource(tuskar.plans, args.plan)
    scales = filter_parameters_to_dict(plan.parameters, 'count')
    fmt.print_dict(scales, outfile=outfile)
    def _deploy_tuskar(self, stack, parsed_args):

        clients = self.app.client_manager
        management = clients.rdomanager_oscplugin.management()
        network_client = clients.network

        # TODO(dmatthews): The Tuskar client has very similar code to this for
        # downloading templates. It should be refactored upstream so we can use
        # it.

        if parsed_args.output_dir:
            output_dir = parsed_args.output_dir
        else:
            output_dir = tempfile.mkdtemp()

        if not os.path.isdir(output_dir):
            os.mkdir(output_dir)

        management_plan = tuskarutils.find_resource(
            management.plans, parsed_args.plan)

        # retrieve templates
        templates = management.plans.templates(management_plan.uuid)

        parameters = self._update_paramaters(
            parsed_args, network_client, stack)

        if stack is None:
            ca_key_pem, ca_cert_pem = keystone_pki.create_ca_pair()
            signing_key_pem, signing_cert_pem = (
                keystone_pki.create_signing_pair(ca_key_pem, ca_cert_pem))
            parameters['Controller-1::KeystoneCACertificate'] = ca_cert_pem
            parameters['Controller-1::KeystoneSigningCertificate'] = (
                signing_cert_pem)
            parameters['Controller-1::KeystoneSigningKey'] = signing_key_pem

        # Save the parameters to Tuskar so they can be used when redeploying.
        # Tuskar expects to get all values as strings. So we convert them all
        # below.
        management.plans.patch(
            management_plan.uuid,
            [{'name': x[0], 'value': six.text_type(x[1])}
             for x in parameters.items()]
        )

        # write file for each key-value in templates
        print("The following templates will be written:")
        for template_name, template_content in templates.items():

            # It's possible to organize the role templates and their dependent
            # files into directories, in which case the template_name will
            # carry the directory information. If that's the case, first
            # create the directory structure (if it hasn't already been
            # created by another file in the templates list).
            template_dir = os.path.dirname(template_name)
            output_template_dir = os.path.join(output_dir, template_dir)
            if template_dir and not os.path.exists(output_template_dir):
                os.makedirs(output_template_dir)

            filename = os.path.join(output_dir, template_name)
            with open(filename, 'w+') as template_file:
                template_file.write(template_content)
            print(filename)

        overcloud_yaml = os.path.join(output_dir, 'plan.yaml')
        environment_yaml = os.path.join(output_dir, 'environment.yaml')
        environments = [environment_yaml, ]
        if parsed_args.rhel_reg:
            reg_env = self._create_registration_env(parsed_args)
            environments.extend(reg_env)
        if parsed_args.environment_files:
            environments.extend(parsed_args.environment_files)

        self._heat_deploy(stack, overcloud_yaml, parameters, environments,
                          parsed_args.timeout)
def do_overcloud_role_show(tuskar, args, outfile=sys.stdout):
    """Show an individual Overcloud Role by its ID or name."""
    overcloud_role = utils.find_resource(tuskar.overcloud_roles, args.role)
    print_role_detail(overcloud_role, outfile=outfile)