def _get_attrs(client_manager, parsed_args): attrs = {} attrs['object_type'] = parsed_args.type attrs['action'] = parsed_args.action network_client = client_manager.network if parsed_args.type == 'network': object_id = network_client.find_network( parsed_args.rbac_object, ignore_missing=False).id if parsed_args.type == 'qos_policy': object_id = network_client.find_qos_policy( parsed_args.rbac_object, ignore_missing=False).id attrs['object_id'] = object_id identity_client = client_manager.identity project_id = identity_common.find_project( identity_client, parsed_args.target_project, parsed_args.target_project_domain, ).id attrs['target_tenant'] = project_id if parsed_args.project is not None: project_id = identity_common.find_project( identity_client, parsed_args.project, parsed_args.project_domain, ).id attrs['tenant_id'] = project_id return attrs
def _get_attrs(client_manager, parsed_args): attrs = {} attrs['object_type'] = parsed_args.type attrs['action'] = parsed_args.action network_client = client_manager.network if parsed_args.type == 'network': object_id = network_client.find_network( parsed_args.rbac_object, ignore_missing=False).id if parsed_args.type == 'qos_policy': # TODO(Huanxuan Ao): Support finding a object ID by obejct name # after qos policy finding supported in SDK. object_id = parsed_args.rbac_object attrs['object_id'] = object_id identity_client = client_manager.identity project_id = identity_common.find_project( identity_client, parsed_args.target_project, parsed_args.target_project_domain, ).id attrs['target_tenant'] = project_id if parsed_args.project is not None: project_id = identity_common.find_project( identity_client, parsed_args.project, parsed_args.project_domain, ).id attrs['tenant_id'] = project_id return attrs
def take_action(self, parsed_args): client = self.app.client_manager.identity endpointgroup = None if parsed_args.endpointgroup: endpointgroup = utils.find_resource(client.endpoint_groups, parsed_args.endpointgroup) project = None if parsed_args.project: project = common.find_project(client, parsed_args.project, parsed_args.domain) if endpointgroup: # List projects associated to the endpoint group columns = ('ID', 'Name') data = client.endpoint_filter.list_projects_for_endpoint_group( endpoint_group=endpointgroup.id) elif project: columns = ('ID', 'Name') data = client.endpoint_filter.list_endpoint_groups_for_project( project=project.id) else: columns = ('ID', 'Name', 'Description') data = client.endpoint_groups.list() return (columns, (utils.get_item_properties( s, columns, formatters={}, ) for s in data))
def take_action(self, parsed_args): compute_client = self.app.client_manager.compute identity_client = self.app.client_manager.identity flavor = _find_flavor(compute_client, parsed_args.flavor) result = 0 if parsed_args.property: try: flavor.unset_keys(parsed_args.property) except Exception as e: LOG.error(_("Failed to unset flavor property: %s"), e) result += 1 if parsed_args.project: try: if flavor.is_public: msg = _("Cannot remove access for a public flavor") raise exceptions.CommandError(msg) else: project_id = identity_common.find_project( identity_client, parsed_args.project, parsed_args.project_domain, ).id compute_client.flavor_access.remove_tenant_access( flavor.id, project_id) except Exception as e: LOG.error(_("Failed to remove flavor access from project: %s"), e) result += 1 if result > 0: raise exceptions.CommandError(_("Command Failed: One or more of" " the operations failed"))
def take_action(self, parsed_args): identity_client = self.app.client_manager.identity if parsed_args.password_prompt: parsed_args.password = utils.get_password(self.app.stdin) user = utils.find_resource( identity_client.users, parsed_args.user, ) kwargs = {} if parsed_args.name: kwargs['name'] = parsed_args.name if parsed_args.email: kwargs['email'] = parsed_args.email if parsed_args.password: kwargs['password'] = parsed_args.password if parsed_args.description: kwargs['description'] = parsed_args.description if parsed_args.project: project_id = common.find_project(identity_client, parsed_args.project, parsed_args.project_domain).id kwargs['default_project'] = project_id kwargs['enabled'] = user.enabled if parsed_args.enable: kwargs['enabled'] = True if parsed_args.disable: kwargs['enabled'] = False identity_client.users.update(user.id, **kwargs)
def take_action(self, parsed_args): network_client = self.app.client_manager.network try: # Verify that the extension exists. network_client.find_extension('network-segment-range', ignore_missing=False) except Exception as e: msg = (_('Network segment range create not supported by ' 'Network API: %(e)s') % {'e': e}) raise exceptions.CommandError(msg) identity_client = self.app.client_manager.identity if not parsed_args.private and parsed_args.project: msg = _("--project is only allowed with --private") raise exceptions.CommandError(msg) if (parsed_args.network_type.lower() != 'vlan' and parsed_args.physical_network): msg = _("--physical-network is only allowed with --network-type " "vlan") raise exceptions.CommandError(msg) attrs = {} if parsed_args.shared or parsed_args.private: attrs['shared'] = parsed_args.shared else: # default to be ``shared`` if not specified attrs['shared'] = True attrs['network_type'] = parsed_args.network_type attrs['minimum'] = parsed_args.minimum attrs['maximum'] = parsed_args.maximum if parsed_args.name: attrs['name'] = parsed_args.name if parsed_args.project: project_id = identity_common.find_project( identity_client, parsed_args.project, parsed_args.project_domain, ).id if project_id: attrs['project_id'] = project_id else: msg = (_("Failed to create the network segment range for " "project %(project_id)s") % parsed_args.project_id) raise exceptions.CommandError(msg) elif not attrs['shared']: # default to the current project if no project specified and shared # is not specified. # Get the project id from the current auth. attrs['project_id'] = self.app.client_manager.auth_ref.project_id if parsed_args.physical_network: attrs['physical_network'] = parsed_args.physical_network obj = network_client.create_network_segment_range(**attrs) display_columns, columns = _get_columns(obj) data = utils.get_item_properties(obj, columns) data = _update_additional_fields_from_props(columns, props=data) return (display_columns, data)
def _get_attrs(client_manager, parsed_args): attrs = {} network_client = client_manager.network if parsed_args.name is not None: attrs['name'] = str(parsed_args.name) if parsed_args.prefixes is not None: attrs['prefixes'] = parsed_args.prefixes if parsed_args.default_prefix_length is not None: attrs['default_prefixlen'] = parsed_args.default_prefix_length if parsed_args.min_prefix_length is not None: attrs['min_prefixlen'] = parsed_args.min_prefix_length if parsed_args.max_prefix_length is not None: attrs['max_prefixlen'] = parsed_args.max_prefix_length if parsed_args.address_scope is not None: attrs['address_scope_id'] = network_client.find_address_scope( parsed_args.address_scope, ignore_missing=False).id if 'no_address_scope' in parsed_args and parsed_args.no_address_scope: attrs['address_scope_id'] = None # "subnet pool set" command doesn't support setting project. if 'project' in parsed_args and parsed_args.project is not None: identity_client = client_manager.identity project_id = identity_common.find_project( identity_client, parsed_args.project, parsed_args.project_domain, ).id attrs['tenant_id'] = project_id return attrs
def take_action(self, parsed_args): volume_client = self.app.client_manager.volume identity_client = self.app.client_manager.identity volume_type = utils.find_resource( volume_client.volume_types, parsed_args.volume_type, ) result = 0 if parsed_args.property: try: volume_type.unset_keys(parsed_args.property) except Exception as e: LOG.error(_("Failed to unset volume type property: %s"), e) result += 1 if parsed_args.project: project_info = None try: project_info = identity_common.find_project( identity_client, parsed_args.project, parsed_args.project_domain) volume_client.volume_type_access.remove_project_access( volume_type.id, project_info.id) except Exception as e: LOG.error(_("Failed to remove volume type access from " "project: %s"), e) result += 1 if result > 0: raise exceptions.CommandError(_("Command Failed: One or more of" " the operations failed"))
def _get_attrs(client_manager, parsed_args): attrs = {} if parsed_args.name is not None: attrs['name'] = str(parsed_args.name) if parsed_args.enable: attrs['admin_state_up'] = True if parsed_args.disable: attrs['admin_state_up'] = False # centralized is available only for SetRouter and not for CreateRouter if 'centralized' in parsed_args and parsed_args.centralized: attrs['distributed'] = False if parsed_args.distributed: attrs['distributed'] = True if ('availability_zone_hints' in parsed_args and parsed_args.availability_zone_hints is not None): attrs['availability_zone_hints'] = parsed_args.availability_zone_hints # "router set" command doesn't support setting project. if 'project' in parsed_args and parsed_args.project is not None: identity_client = client_manager.identity project_id = identity_common.find_project( identity_client, parsed_args.project, parsed_args.project_domain, ).id attrs['tenant_id'] = project_id # TODO(tangchen): Support getting 'ha' property. # TODO(tangchen): Support getting 'external_gateway_info' property. return attrs
def take_action(self, parsed_args): client = self.app.client_manager.network columns = ( 'network_id', 'network_name', 'total_ips', 'used_ips', ) column_headers = ( 'Network ID', 'Network Name', 'Total IPs', 'Used IPs', ) filters = {} if parsed_args.ip_version: filters['ip_version'] = parsed_args.ip_version if parsed_args.project: identity_client = self.app.client_manager.identity project_id = identity_common.find_project( identity_client, parsed_args.project, parsed_args.project_domain, ).id filters['tenant_id'] = project_id filters['project_id'] = project_id data = client.network_ip_availabilities(**filters) return (column_headers, (utils.get_item_properties( s, columns, ) for s in data))
def _get_attrs(client_manager, parsed_args): attrs = {} if parsed_args.name is not None: attrs['name'] = str(parsed_args.name) if parsed_args.admin_state_up is not None: attrs['admin_state_up'] = parsed_args.admin_state_up if parsed_args.distributed is not None: attrs['distributed'] = parsed_args.distributed if ('availability_zone_hints' in parsed_args and parsed_args.availability_zone_hints is not None): attrs['availability_zone_hints'] = parsed_args.availability_zone_hints if 'clear_routes' in parsed_args and parsed_args.clear_routes: attrs['routes'] = [] elif 'routes' in parsed_args and parsed_args.routes is not None: attrs['routes'] = parsed_args.routes # "router set" command doesn't support setting project. if 'project' in parsed_args and parsed_args.project is not None: identity_client = client_manager.identity project_id = identity_common.find_project( identity_client, parsed_args.project, parsed_args.project_domain, ).id attrs['tenant_id'] = project_id # TODO(tangchen): Support getting 'ha' property. # TODO(tangchen): Support getting 'external_gateway_info' property. return attrs
def take_action(self, parsed_args): identity_client = self.app.client_manager.identity if parsed_args.password_prompt: parsed_args.password = utils.get_password(self.app.stdin) if '' == parsed_args.password: LOG.warning(_("No password was supplied, authentication will fail " "when a user does not have a password.")) user = utils.find_resource( identity_client.users, parsed_args.user, ) kwargs = {} if parsed_args.name: kwargs['name'] = parsed_args.name if parsed_args.email: kwargs['email'] = parsed_args.email if parsed_args.password: kwargs['password'] = parsed_args.password if parsed_args.description: kwargs['description'] = parsed_args.description if parsed_args.project: project_id = common.find_project(identity_client, parsed_args.project, parsed_args.project_domain).id kwargs['default_project'] = project_id kwargs['enabled'] = user.enabled if parsed_args.enable: kwargs['enabled'] = True if parsed_args.disable: kwargs['enabled'] = False identity_client.users.update(user.id, **kwargs)
def _get_attrs(client_manager, parsed_args): attrs = {} if parsed_args.name is not None: attrs['name'] = str(parsed_args.name) if parsed_args.admin_state is not None: attrs['admin_state_up'] = parsed_args.admin_state if parsed_args.shared is not None: attrs['shared'] = parsed_args.shared # "network set" command doesn't support setting project. if 'project' in parsed_args and parsed_args.project is not None: identity_client = client_manager.identity project_id = identity_common.find_project( identity_client, parsed_args.project, parsed_args.project_domain, ).id attrs['tenant_id'] = project_id # "network set" command doesn't support setting availability zone hints. if 'availability_zone_hints' in parsed_args and \ parsed_args.availability_zone_hints is not None: attrs['availability_zone_hints'] = parsed_args.availability_zone_hints return attrs
def take_action_network(self, client, parsed_args): filters = {} if parsed_args.project: identity_client = self.app.client_manager.identity project_id = identity_common.find_project( identity_client, parsed_args.project, parsed_args.project_domain, ).id filters['tenant_id'] = project_id filters['project_id'] = project_id _tag.get_tag_filtering_args(parsed_args, filters) data = client.security_groups(**filters) columns = ( "ID", "Name", "Description", "Project ID", "tags" ) column_headers = ( "ID", "Name", "Description", "Project", "Tags" ) return (column_headers, (utils.get_item_properties( s, columns, ) for s in data))
def take_action(self, parsed_args): identity_client = self.app.client_manager.identity if parsed_args.auth_project: project_id = self.app.client_manager.auth_ref.project_id elif parsed_args.project: try: project_id = identity_common.find_project( identity_client, parsed_args.project, parsed_args.project_domain, ).id except AttributeError: # using v2 auth and supplying a domain project_id = utils.find_resource( identity_client.tenants, parsed_args.project, ).id # delete all non-identity resources self.delete_resources(parsed_args.dry_run, project_id) # clean up the project if not parsed_args.keep_project: LOG.warning(_('Deleting project: %s'), project_id) if not parsed_args.dry_run: identity_client.projects.delete(project_id)
def take_action_network(self, client, parsed_args): # Build the create attributes. attrs = {} attrs['name'] = parsed_args.name attrs['description'] = self._get_description(parsed_args) if parsed_args.project is not None: identity_client = self.app.client_manager.identity project_id = identity_common.find_project( identity_client, parsed_args.project, parsed_args.project_domain, ).id attrs['tenant_id'] = project_id # Create the security group and display the results. obj = client.create_security_group(**attrs) # tags cannot be set when created, so tags need to be set later. _tag.update_tags_for_set(client, obj, parsed_args) display_columns, property_columns = _get_columns(obj) data = utils.get_item_properties( obj, property_columns, formatters=_formatters_network ) return (display_columns, data)
def _get_attrs(client_manager, parsed_args): attrs = {} if parsed_args.name is not None: attrs['name'] = parsed_args.name if parsed_args.enable: attrs['admin_state_up'] = True if parsed_args.disable: attrs['admin_state_up'] = False if parsed_args.centralized: attrs['distributed'] = False if parsed_args.distributed: attrs['distributed'] = True if ('availability_zone_hints' in parsed_args and parsed_args.availability_zone_hints is not None): attrs['availability_zone_hints'] = parsed_args.availability_zone_hints if parsed_args.description is not None: attrs['description'] = parsed_args.description # "router set" command doesn't support setting project. if 'project' in parsed_args and parsed_args.project is not None: identity_client = client_manager.identity project_id = identity_common.find_project( identity_client, parsed_args.project, parsed_args.project_domain, ).id attrs['tenant_id'] = project_id return attrs
def take_action(self, parsed_args): identity_client = self.app.client_manager.identity if (not parsed_args.name and not parsed_args.domain and not parsed_args.description and not parsed_args.enable and not parsed_args.property and not parsed_args.disable): return project = common.find_project(identity_client, parsed_args.project, parsed_args.domain) kwargs = {} if parsed_args.name: kwargs['name'] = parsed_args.name if parsed_args.description: kwargs['description'] = parsed_args.description if parsed_args.enable: kwargs['enabled'] = True if parsed_args.disable: kwargs['enabled'] = False if parsed_args.property: kwargs.update(parsed_args.property) identity_client.projects.update(project.id, **kwargs)
def _get_attrs_for_trunk(client_manager, parsed_args): attrs = {} if parsed_args.name is not None: attrs['name'] = str(parsed_args.name) if parsed_args.enable: attrs['admin_state_up'] = True if parsed_args.disable: attrs['admin_state_up'] = False if 'parent_port' in parsed_args and parsed_args.parent_port is not None: port_id = _get_id(client_manager.neutronclient, parsed_args.parent_port, 'port') attrs['port_id'] = port_id if 'add_subports' in parsed_args and parsed_args.add_subports is not None: attrs[SUB_PORTS] = _format_subports(client_manager, parsed_args.add_subports) # "trunk set" command doesn't support setting project. if 'project' in parsed_args and parsed_args.project is not None: identity_client = client_manager.identity project_id = identity_common.find_project( identity_client, parsed_args.project, parsed_args.project_domain, ).id attrs['tenant_id'] = project_id return attrs
def _get_attrs(client_manager, parsed_args): attrs = {} if parsed_args.exclude: attrs['excluded'] = True if parsed_args.include: attrs['excluded'] = False if parsed_args.ingress or not parsed_args.egress: attrs['direction'] = 'ingress' if parsed_args.egress: attrs['direction'] = 'egress' if parsed_args.remote_ip_prefix is not None: attrs['remote_ip_prefix'] = parsed_args.remote_ip_prefix if parsed_args.meter is not None: attrs['metering_label_id'] = parsed_args.meter if parsed_args.project is not None: identity_client = client_manager.identity project_id = identity_common.find_project( identity_client, parsed_args.project, parsed_args.project_domain, ).id attrs['tenant_id'] = project_id return attrs
def _process_identity_and_resource_options(parsed_args, identity_client_manager): kwargs = {} if parsed_args.user and parsed_args.domain: kwargs['user'] = common.find_user( identity_client_manager, parsed_args.user, parsed_args.user_domain, ).id kwargs['domain'] = common.find_domain( identity_client_manager, parsed_args.domain, ).id elif parsed_args.user and parsed_args.project: kwargs['user'] = common.find_user( identity_client_manager, parsed_args.user, parsed_args.user_domain, ).id kwargs['project'] = common.find_project( identity_client_manager, parsed_args.project, parsed_args.project_domain, ).id elif parsed_args.group and parsed_args.domain: kwargs['group'] = common.find_group( identity_client_manager, parsed_args.group, parsed_args.group_domain, ).id kwargs['domain'] = common.find_domain( identity_client_manager, parsed_args.domain, ).id elif parsed_args.group and parsed_args.project: kwargs['group'] = common.find_group( identity_client_manager, parsed_args.group, parsed_args.group_domain, ).id kwargs['project'] = common.find_project( identity_client_manager, parsed_args.project, parsed_args.project_domain, ).id kwargs['os_inherit_extension_inherited'] = parsed_args.inherited return kwargs
def take_action(self, parsed_args): volume_client = self.app.client_manager.volume identity_client = self.app.client_manager.identity volume_type = utils.find_resource( volume_client.volume_types, parsed_args.volume_type) if (not parsed_args.name and not parsed_args.description and not parsed_args.property and not parsed_args.project): self.app.log.error("No changes requested\n") return result = 0 kwargs = {} if parsed_args.name: kwargs['name'] = parsed_args.name if parsed_args.description: kwargs['description'] = parsed_args.description if kwargs: try: volume_client.volume_types.update( volume_type.id, **kwargs ) except Exception as e: self.app.log.error("Failed to update volume type name or" " description: " + str(e)) result += 1 if parsed_args.property: try: volume_type.set_keys(parsed_args.property) except Exception as e: self.app.log.error("Failed to set volume type property: " + str(e)) result += 1 if parsed_args.project: project_info = None try: project_info = identity_common.find_project( identity_client, parsed_args.project, parsed_args.project_domain) volume_client.volume_type_access.add_project_access( volume_type.id, project_info.id) except Exception as e: self.app.log.error("Failed to set volume type access to" " project: " + str(e)) result += 1 if result > 0: raise exceptions.CommandError("Command Failed: One or more of the" " operations failed")
def _get_attrs(client_manager, parsed_args): attrs = {} # Handle deprecated options # NOTE(dtroyer): --device-id and --host-id were deprecated in Mar 2016. # Do not remove before 3.x release or Mar 2017. if parsed_args.device_id: attrs['device_id'] = parsed_args.device_id LOG.warning(_( 'The --device-id option is deprecated, ' 'please use --device instead.' )) if parsed_args.host_id: attrs['binding:host_id'] = parsed_args.host_id LOG.warning(_( 'The --host-id option is deprecated, ' 'please use --host instead.' )) if parsed_args.fixed_ip is not None: attrs['fixed_ips'] = parsed_args.fixed_ip if parsed_args.device: attrs['device_id'] = parsed_args.device if parsed_args.device_owner is not None: attrs['device_owner'] = parsed_args.device_owner if parsed_args.enable: attrs['admin_state_up'] = True if parsed_args.disable: attrs['admin_state_up'] = False if parsed_args.binding_profile is not None: attrs['binding:profile'] = parsed_args.binding_profile if parsed_args.vnic_type is not None: attrs['binding:vnic_type'] = parsed_args.vnic_type if parsed_args.host: attrs['binding:host_id'] = parsed_args.host # It is possible that name is not updated during 'port set' if parsed_args.name is not None: attrs['name'] = str(parsed_args.name) # The remaining options do not support 'port set' command, so they require # additional check if 'mac_address' in parsed_args and parsed_args.mac_address is not None: attrs['mac_address'] = parsed_args.mac_address if 'network' in parsed_args and parsed_args.network is not None: attrs['network_id'] = parsed_args.network if 'project' in parsed_args and parsed_args.project is not None: # TODO(singhj): since 'project' logic is common among # router, network, port etc., maybe move it to a common file. identity_client = client_manager.identity project_id = identity_common.find_project( identity_client, parsed_args.project, parsed_args.project_domain, ).id attrs['tenant_id'] = project_id return attrs
def _process_identity_and_resource_options(parsed_args, identity_client_manager): kwargs = {} if parsed_args.user and parsed_args.domain: kwargs["user"] = common.find_user(identity_client_manager, parsed_args.user, parsed_args.user_domain).id kwargs["domain"] = common.find_domain(identity_client_manager, parsed_args.domain).id elif parsed_args.user and parsed_args.project: kwargs["user"] = common.find_user(identity_client_manager, parsed_args.user, parsed_args.user_domain).id kwargs["project"] = common.find_project( identity_client_manager, parsed_args.project, parsed_args.project_domain ).id elif parsed_args.group and parsed_args.domain: kwargs["group"] = common.find_group(identity_client_manager, parsed_args.group, parsed_args.group_domain).id kwargs["domain"] = common.find_domain(identity_client_manager, parsed_args.domain).id elif parsed_args.group and parsed_args.project: kwargs["group"] = common.find_group(identity_client_manager, parsed_args.group, parsed_args.group_domain).id kwargs["project"] = common.find_project( identity_client_manager, parsed_args.project, parsed_args.project_domain ).id kwargs["os_inherit_extension_inherited"] = parsed_args.inherited return kwargs
def take_action_network(self, client, parsed_args): filters = {} if parsed_args.project: identity_client = self.app.client_manager.identity project_id = identity_common.find_project( identity_client, parsed_args.project, parsed_args.project_domain, ).id filters['tenant_id'] = project_id return self._get_return_data(client.security_groups(**filters))
def get_body(self, parsed_args): body = {"name": str(parsed_args.name), "admin_state_up": parsed_args.admin_state} if parsed_args.shared is not None: body["shared"] = parsed_args.shared if parsed_args.project is not None: identity_client = self.app.client_manager.identity project_id = identity_common.find_project( identity_client, parsed_args.project, parsed_args.project_domain ).id body["tenant_id"] = project_id return body
def take_action(self, parsed_args): identity_client = self.app.client_manager.identity endpoint = None if parsed_args.endpoint: endpoint = utils.find_resource(identity_client.endpoints, parsed_args.endpoint) project = None if parsed_args.project: project = common.find_project(identity_client, parsed_args.project, parsed_args.project_domain) if endpoint: columns = ('ID', 'Name') data = ( identity_client.endpoint_filter .list_projects_for_endpoint(endpoint=endpoint.id) ) else: columns = ('ID', 'Region', 'Service Name', 'Service Type', 'Enabled', 'Interface', 'URL') kwargs = {} if parsed_args.service: service = common.find_service(identity_client, parsed_args.service) kwargs['service'] = service.id if parsed_args.interface: kwargs['interface'] = parsed_args.interface if parsed_args.region: kwargs['region'] = parsed_args.region if project: data = ( identity_client.endpoint_filter .list_endpoints_for_project(project=project.id) ) else: data = identity_client.endpoints.list(**kwargs) service_list = identity_client.services.list() for ep in data: service = common.find_service_in_list(service_list, ep.service_id) ep.service_name = get_service_name(service) ep.service_type = service.type return (columns, (utils.get_item_properties( s, columns, formatters={}, ) for s in data))
def _get_attrs(client_manager, parsed_args): attrs = {} if parsed_args.name is not None: attrs['name'] = str(parsed_args.name) if 'project' in parsed_args and parsed_args.project is not None: identity_client = client_manager.identity project_id = identity_common.find_project( identity_client, parsed_args.project, parsed_args.project_domain, ).id attrs['tenant_id'] = project_id client = client_manager.network attrs['network_id'] = client.find_network(parsed_args.network, ignore_missing=False).id if parsed_args.subnet_pool is not None: subnet_pool = client.find_subnet_pool(parsed_args.subnet_pool, ignore_missing=False) attrs['subnetpool_id'] = subnet_pool.id if parsed_args.use_default_subnet_pool: attrs['use_default_subnetpool'] = True if parsed_args.gateway.lower() != 'auto': if parsed_args.gateway.lower() == 'none': attrs['gateway_ip'] = None else: attrs['gateway_ip'] = parsed_args.gateway if parsed_args.prefix_length is not None: attrs['prefixlen'] = parsed_args.prefix_length if parsed_args.subnet_range is not None: attrs['cidr'] = parsed_args.subnet_range if parsed_args.ip_version is not None: attrs['ip_version'] = parsed_args.ip_version if parsed_args.ipv6_ra_mode is not None: attrs['ipv6_ra_mode'] = parsed_args.ipv6_ra_mode if parsed_args.ipv6_address_mode is not None: attrs['ipv6_address_mode'] = parsed_args.ipv6_address_mode if parsed_args.allocation_pools is not None: attrs['allocation_pools'] = parsed_args.allocation_pools if parsed_args.enable_dhcp is not None: attrs['enable_dhcp'] = parsed_args.enable_dhcp if parsed_args.dns_nameservers is not None: attrs['dns_nameservers'] = parsed_args.dns_nameservers if parsed_args.host_routes is not None: # Change 'gateway' entry to 'nexthop' to match the API attrs['host_routes'] = convert_entries_to_nexthop( parsed_args.host_routes) return attrs
def take_action(self, parsed_args): client = self.app.client_manager.identity endpoint = utils.find_resource(client.endpoints, parsed_args.endpoint) project = common.find_project(client, parsed_args.project, parsed_args.project_domain) client.endpoint_filter.add_endpoint_to_project( project=project.id, endpoint=endpoint.id)
def take_action(self, parsed_args): image_client = self.app.client_manager.image identity_client = self.app.client_manager.identity project_id = common.find_project(identity_client, parsed_args.project, parsed_args.project_domain).id image_id = utils.find_resource( image_client.images, parsed_args.image).id image_client.image_members.delete(image_id, project_id)
def take_action(self, parsed_args): self.log.debug('take_action(%s)' % parsed_args) identity_client = self.app.client_manager.identity role = None if parsed_args.role: role = utils.find_resource( identity_client.roles, parsed_args.role, ) user = None if parsed_args.user: user = common.find_user( identity_client, parsed_args.user, ) domain = None if parsed_args.domain: domain = common.find_domain( identity_client, parsed_args.domain, ) project = None if parsed_args.project: project = common.find_project( identity_client, parsed_args.project, ) group = None if parsed_args.group: group = common.find_group( identity_client, parsed_args.group, ) effective = True if parsed_args.effective else False self.log.debug('take_action(%s)' % parsed_args) columns = ('Role', 'User', 'Group', 'Project', 'Domain') data = identity_client.role_assignments.list(domain=domain, user=user, group=group, project=project, role=role, effective=effective) data_parsed = [] for assignment in data: # Removing the extra "scope" layer in the assignment json scope = assignment.scope if 'project' in scope: setattr(assignment, 'project', scope['project']['id']) assignment.domain = '' elif 'domain' in scope: setattr(assignment, 'domain', scope['domain']['id']) assignment.project = '' else: assignment.domain = '' assignment.project = '' del assignment.scope if hasattr(assignment, 'user'): setattr(assignment, 'user', assignment.user['id']) assignment.group = '' elif hasattr(assignment, 'group'): setattr(assignment, 'group', assignment.group['id']) assignment.user = '' else: assignment.user = '' assignment.group = '' if hasattr(assignment, 'role'): setattr(assignment, 'role', assignment.role['id']) else: assignment.role = '' # Creating a tuple from data object fields # (including the blank ones) data_parsed.append(self._as_tuple(assignment)) return columns, tuple(data_parsed)
def take_action(self, parsed_args): network_client = self.app.client_manager.network try: # Verify that the extension exists. network_client.find_extension('network-segment-range', ignore_missing=False) except Exception as e: msg = (_('Network segment range create not supported by ' 'Network API: %(e)s') % {'e': e}) raise exceptions.CommandError(msg) identity_client = self.app.client_manager.identity if parsed_args.shared and parsed_args.project: msg = _("--project is only allowed with --private") raise exceptions.CommandError(msg) if (parsed_args.network_type.lower() != 'vlan' and parsed_args.physical_network): msg = _("--physical-network is only allowed with --network-type " "vlan") raise exceptions.CommandError(msg) attrs = {} if parsed_args.shared or parsed_args.private: attrs['shared'] = parsed_args.shared else: # default to be ``shared`` if not specified attrs['shared'] = True attrs['network_type'] = parsed_args.network_type attrs['minimum'] = parsed_args.minimum attrs['maximum'] = parsed_args.maximum if parsed_args.name: attrs['name'] = parsed_args.name if parsed_args.project: project_id = identity_common.find_project( identity_client, parsed_args.project, parsed_args.project_domain, ).id if project_id: attrs['project_id'] = project_id else: msg = (_("Failed to create the network segment range for " "project %(project_id)s") % parsed_args.project_id) raise exceptions.CommandError(msg) elif not parsed_args.shared: # default to the current project if no project specified and shared # is not specified. # Get the project id from the current auth. attrs['project_id'] = self.app.client_manager.auth_ref.project_id else: attrs['project_id'] = None if parsed_args.physical_network: attrs['physical_network'] = parsed_args.physical_network obj = network_client.create_network_segment_range(**attrs) display_columns, columns = _get_columns(obj) data = utils.get_item_properties(obj, columns) data = _update_additional_fields_from_props(columns, props=data) return (display_columns, data)
def take_action(self, parsed_args): volume_client = self.app.client_manager.volume compute_client = self.app.client_manager.compute identity_client = self.app.client_manager.identity def _format_attach(attachments): """Return a formatted string of a volume's attached instances :param attachments: a volume.attachments field :rtype: a string of formatted instances """ msg = '' for attachment in attachments: server = attachment['server_id'] if server in server_cache: server = server_cache[server].name device = attachment['device'] msg += 'Attached to %s on %s ' % (server, device) return msg if parsed_args.long: columns = [ 'ID', 'Name', 'Status', 'Size', 'Volume Type', 'Bootable', 'Attachments', 'Metadata', ] column_headers = copy.deepcopy(columns) column_headers[1] = 'Display Name' column_headers[4] = 'Type' column_headers[6] = 'Attached to' column_headers[7] = 'Properties' else: columns = [ 'ID', 'Name', 'Status', 'Size', 'Attachments', ] column_headers = copy.deepcopy(columns) column_headers[1] = 'Display Name' column_headers[4] = 'Attached to' # Cache the server list server_cache = {} try: for s in compute_client.servers.list(): server_cache[s.id] = s except Exception: # Just forget it if there's any trouble pass project_id = None if parsed_args.project: project_id = identity_common.find_project( identity_client, parsed_args.project, parsed_args.project_domain) user_id = None if parsed_args.user: user_id = identity_common.find_user(identity_client, parsed_args.user, parsed_args.user_domain) search_opts = { 'all_tenants': parsed_args.all_projects, 'project_id': project_id, 'user_id': user_id, 'display_name': parsed_args.name, 'status': parsed_args.status, } data = volume_client.volumes.list(search_opts=search_opts) return (column_headers, (utils.get_item_properties( s, columns, formatters={ 'Metadata': utils.format_dict, 'Attachments': _format_attach }, ) for s in data))
def _create_network(self, name, project=None, zone=None, ttl=DEFAULT_TTL): """Create a network and associated default resources""" mgr = self.app.client_manager # Identify project, if applicable if project is None: project = name if isinstance(project, str): project = find_project(mgr.identity, project) # Ensure default security group rules exist self._ensure_default_security_groups(project) # Find or create DNS zone mgr.dns.session.sudo_project_id = project.id if zone is None: zone = '%s.devonly.net.' % name if isinstance(zone, str): zone = next(iter(mgr.dns.zones.list({ 'name': zone, })), None) or mgr.dns.zones.create( zone, 'PRIMARY', email='*****@*****.**', ttl=ttl, ) # Create network and subnets network = mgr.network.create_network( name=name, project_id=project.id, dns_domain=zone['name'], ) subnetv6 = mgr.network.create_subnet( name='%s-ipv6' % name, project_id=project.id, network_id=network.id, ip_version=6, ipv6_ra_mode='dhcpv6-stateful', ipv6_address_mode='dhcpv6-stateful', use_default_subnet_pool=True, ) subnetv4 = mgr.network.create_subnet( name='%s-ipv4' % name, project_id=project.id, network_id=network.id, ip_version=4, use_default_subnet_pool=True, ) # Delay to allow DHCP port to be created time.sleep(2) # Set DHCP port name dhcp = next( mgr.network.ports( network_id=network.id, device_owner='network:dhcp', )) mgr.network.update_port( dhcp, name='%s-dhcp' % name, dns_name='%s-dhcp' % name, description="DHCP agent", ) # Create gateway port gateway = mgr.network.create_port( name='%s-gateway' % name, project_id=project.id, network_id=network.id, dns_name='%s-gateway' % name, description="Default gateway", device_owner='network:router_interface', fixed_ips=[ { 'subnet': subnetv6.id, 'ip_address': subnetv6.gateway_ip }, { 'subnet': subnetv4.id, 'ip_address': subnetv4.gateway_ip }, ], port_security_enabled=False, ) # Add gateway port to router mgr.network.add_interface_to_router( mgr.network.find_router('internal-external', ignore_missing=False), port_id=gateway.id, ) return { 'network': network, 'subnetv6': subnetv6, 'subnetv4': subnetv4, 'dhcp': dhcp, 'gateway': gateway, 'zone': zone, }
def _get_attrs_network(client_manager, parsed_args): attrs = {} if parsed_args.name is not None: attrs['name'] = str(parsed_args.name) if parsed_args.enable: attrs['admin_state_up'] = True if parsed_args.disable: attrs['admin_state_up'] = False if parsed_args.share: attrs['shared'] = True if parsed_args.no_share: attrs['shared'] = False if parsed_args.enable_port_security: attrs['port_security_enabled'] = True if parsed_args.disable_port_security: attrs['port_security_enabled'] = False # "network set" command doesn't support setting project. if 'project' in parsed_args and parsed_args.project is not None: identity_client = client_manager.identity project_id = identity_common.find_project( identity_client, parsed_args.project, parsed_args.project_domain, ).id # TODO(dtroyer): Remove tenant_id when we clean up the SDK refactor attrs['tenant_id'] = project_id attrs['project_id'] = project_id # "network set" command doesn't support setting availability zone hints. if 'availability_zone_hints' in parsed_args and \ parsed_args.availability_zone_hints is not None: attrs['availability_zone_hints'] = parsed_args.availability_zone_hints # set description if parsed_args.description: attrs['description'] = parsed_args.description # update_external_network_options if parsed_args.internal: attrs['router:external'] = False if parsed_args.external: attrs['router:external'] = True if parsed_args.no_default: attrs['is_default'] = False if parsed_args.default: attrs['is_default'] = True # Update Provider network options if parsed_args.provider_network_type: attrs['provider:network_type'] = parsed_args.provider_network_type if parsed_args.physical_network: attrs['provider:physical_network'] = parsed_args.physical_network if parsed_args.segmentation_id: attrs['provider:segmentation_id'] = parsed_args.segmentation_id if hasattr(parsed_args, 'wrs-tm:qos'): attrs['wrs-tm:qos'] = getattr(parsed_args, 'wrs-tm:qos') if parsed_args.qos_policy is not None: network_client = client_manager.network _qos_policy = network_client.find_qos_policy(parsed_args.qos_policy, ignore_missing=False) attrs['qos_policy_id'] = _qos_policy.id if 'no_qos_policy' in parsed_args and parsed_args.no_qos_policy: attrs['qos_policy_id'] = None return attrs
def take_action(self, parsed_args): volume_client = self.app.client_manager.volume identity_client = self.app.client_manager.identity if parsed_args.long: columns = [ 'ID', 'Name', 'Description', 'Status', 'Size', 'Created At', 'Volume ID', 'Metadata' ] column_headers = copy.deepcopy(columns) column_headers[6] = 'Volume' column_headers[7] = 'Properties' else: columns = ['ID', 'Name', 'Description', 'Status', 'Size'] column_headers = copy.deepcopy(columns) # Cache the volume list volume_cache = {} try: for s in volume_client.volumes.list(): volume_cache[s.id] = s except Exception: # Just forget it if there's any trouble pass _VolumeIdColumn = functools.partial(VolumeIdColumn, volume_cache=volume_cache) volume_id = None if parsed_args.volume: volume_id = utils.find_resource(volume_client.volumes, parsed_args.volume).id project_id = None if parsed_args.project: project_id = identity_common.find_project( identity_client, parsed_args.project, parsed_args.project_domain).id # set value of 'all_tenants' when using project option all_projects = True if parsed_args.project else \ parsed_args.all_projects search_opts = { 'all_tenants': all_projects, 'project_id': project_id, 'name': parsed_args.name, 'status': parsed_args.status, 'volume_id': volume_id, } data = volume_client.volume_snapshots.list( search_opts=search_opts, marker=parsed_args.marker, limit=parsed_args.limit, ) return (column_headers, (utils.get_item_properties( s, columns, formatters={ 'Metadata': format_columns.DictColumn, 'Volume ID': _VolumeIdColumn }, ) for s in data))
def get_resource_id(resource, resource_name, name): """Converts a resource name into a UUID for consumption for the API :param callable resource: A client_manager callable :param resource_name: The resource key name for the dictonary returned :param name: The name of the resource to convert to UUID :return: The UUID of the found resource """ try: # Allow None as a value if resource_name in ('policies', ): if name.lower() in ('none', 'null', 'void'): return None # Projects can be non-uuid so we need to account for this if resource_name == 'project': if name != 'non-uuid': project_id = identity_common.find_project(resource, name).id return project_id else: return 'non-uuid' elif resource_name == 'members': names = [ re for re in resource(name['pool_id'])['members'] if re.get('id') == name['member_id'] or re.get('name') == name['member_id'] ] name = name['member_id'] if len(names) > 1: msg = ("{0} {1} found with name or ID of {2}. Please try " "again with UUID".format(len(names), resource_name, name)) raise exceptions.CommandError(msg) else: return names[0].get('id') elif resource_name == 'l7rules': names = [ re for re in resource(name['l7policy_id'])['rules'] if re.get('id') == name['l7rule_id'] ] name = name['l7rule_id'] return names[0].get('id') else: names = [ re for re in resource()[resource_name] if re.get('name') == name or re.get('id') == name ] if len(names) > 1: msg = ("{0} {1} found with name or ID of {2}. Please try " "again with UUID".format(len(names), resource_name, name)) raise exceptions.CommandError(msg) else: return names[0].get('id') except IndexError: msg = "Unable to locate {0} in {1}".format(name, resource_name) raise exceptions.CommandError(msg)
def _get_attrs(client_manager, parsed_args): attrs = {} if parsed_args.description is not None: attrs['description'] = parsed_args.description if parsed_args.device: attrs['device_id'] = parsed_args.device if parsed_args.device_owner is not None: attrs['device_owner'] = parsed_args.device_owner if parsed_args.enable: attrs['admin_state_up'] = True if parsed_args.disable: attrs['admin_state_up'] = False if parsed_args.vnic_type is not None: attrs['binding:vnic_type'] = parsed_args.vnic_type if parsed_args.host: attrs['binding:host_id'] = parsed_args.host if parsed_args.mac_address is not None: attrs['mac_address'] = parsed_args.mac_address if parsed_args.dns_domain is not None: attrs['dns_domain'] = parsed_args.dns_domain if parsed_args.dns_name is not None: attrs['dns_name'] = parsed_args.dns_name # It is possible that name is not updated during 'port set' if parsed_args.name is not None: attrs['name'] = parsed_args.name # The remaining options do not support 'port set' command, so they require # additional check if 'network' in parsed_args and parsed_args.network is not None: attrs['network_id'] = parsed_args.network if 'project' in parsed_args and parsed_args.project is not None: # TODO(singhj): since 'project' logic is common among # router, network, port etc., maybe move it to a common file. identity_client = client_manager.identity project_id = identity_common.find_project( identity_client, parsed_args.project, parsed_args.project_domain, ).id attrs['tenant_id'] = project_id if parsed_args.disable_port_security: attrs['port_security_enabled'] = False if parsed_args.enable_port_security: attrs['port_security_enabled'] = True if 'no_qos_policy' in parsed_args and parsed_args.no_qos_policy: attrs['qos_policy_id'] = None if parsed_args.qos_policy: attrs['qos_policy_id'] = client_manager.network.find_qos_policy( parsed_args.qos_policy, ignore_missing=False).id if ('enable_uplink_status_propagation' in parsed_args and parsed_args.enable_uplink_status_propagation): attrs['propagate_uplink_status'] = True if ('disable_uplink_status_propagation' in parsed_args and parsed_args.disable_uplink_status_propagation): attrs['propagate_uplink_status'] = False if ('numa_policy_required' in parsed_args and parsed_args.numa_policy_required): attrs['numa_affinity_policy'] = 'required' elif ('numa_policy_preferred' in parsed_args and parsed_args.numa_policy_preferred): attrs['numa_affinity_policy'] = 'preferred' elif ('numa_policy_legacy' in parsed_args and parsed_args.numa_policy_legacy): attrs['numa_affinity_policy'] = 'legacy' return attrs
def _process_identity_and_resource_options(parsed_args, identity_client_manager): kwargs = {} if parsed_args.user and parsed_args.system: kwargs['user'] = common.find_user( identity_client_manager, parsed_args.user, parsed_args.user_domain, ).id kwargs['system'] = parsed_args.system elif parsed_args.user and parsed_args.domain: kwargs['user'] = common.find_user( identity_client_manager, parsed_args.user, parsed_args.user_domain, ).id kwargs['domain'] = common.find_domain( identity_client_manager, parsed_args.domain, ).id elif parsed_args.user and parsed_args.project: kwargs['user'] = common.find_user( identity_client_manager, parsed_args.user, parsed_args.user_domain, ).id kwargs['project'] = common.find_project( identity_client_manager, parsed_args.project, parsed_args.project_domain, ).id elif parsed_args.group and parsed_args.system: kwargs['group'] = common.find_group( identity_client_manager, parsed_args.group, parsed_args.group_domain, ).id kwargs['system'] = parsed_args.system elif parsed_args.group and parsed_args.domain: kwargs['group'] = common.find_group( identity_client_manager, parsed_args.group, parsed_args.group_domain, ).id kwargs['domain'] = common.find_domain( identity_client_manager, parsed_args.domain, ).id elif parsed_args.group and parsed_args.project: kwargs['group'] = common.find_group( identity_client_manager, parsed_args.group, parsed_args.group_domain, ).id kwargs['project'] = common.find_project( identity_client_manager, parsed_args.project, parsed_args.project_domain, ).id kwargs['os_inherit_extension_inherited'] = parsed_args.inherited return kwargs
def take_action_network(self, client, parsed_args): # Get the security group ID to hold the rule. security_group_id = client.find_security_group(parsed_args.group, ignore_missing=False).id # Build the create attributes. attrs = {} attrs['protocol'] = self._get_protocol(parsed_args) if parsed_args.description is not None: attrs['description'] = parsed_args.description # NOTE(rtheis): A direction must be specified and ingress # is the default. if parsed_args.ingress or not parsed_args.egress: attrs['direction'] = 'ingress' if parsed_args.egress: attrs['direction'] = 'egress' # NOTE(rtheis): Use ethertype specified else default based # on IP protocol. if parsed_args.ethertype: attrs['ethertype'] = parsed_args.ethertype elif self._is_ipv6_protocol(attrs['protocol']): attrs['ethertype'] = 'IPv6' else: attrs['ethertype'] = 'IPv4' # NOTE(rtheis): Validate the port range and ICMP type and code. # It would be ideal if argparse could do this. if parsed_args.dst_port and (parsed_args.icmp_type or parsed_args.icmp_code): msg = _('Argument --dst-port not allowed with arguments ' '--icmp-type and --icmp-code') raise exceptions.CommandError(msg) if parsed_args.icmp_type is None and parsed_args.icmp_code is not None: msg = _('Argument --icmp-type required with argument --icmp-code') raise exceptions.CommandError(msg) is_icmp_protocol = _is_icmp_protocol(attrs['protocol']) if not is_icmp_protocol and (parsed_args.icmp_type or parsed_args.icmp_code): msg = _('ICMP IP protocol required with arguments ' '--icmp-type and --icmp-code') raise exceptions.CommandError(msg) # NOTE(rtheis): For backwards compatibility, continue ignoring # the destination port range when an ICMP IP protocol is specified. if parsed_args.dst_port and not is_icmp_protocol: attrs['port_range_min'] = parsed_args.dst_port[0] attrs['port_range_max'] = parsed_args.dst_port[1] if parsed_args.icmp_type: attrs['port_range_min'] = parsed_args.icmp_type if parsed_args.icmp_code: attrs['port_range_max'] = parsed_args.icmp_code # NOTE(dtroyer): --src-ip and --src-group were deprecated in Nov 2016. # Do not remove before 4.x release or Nov 2017. if not (parsed_args.remote_group is None and parsed_args.src_group is None): attrs['remote_group_id'] = client.find_security_group( parsed_args.remote_group or parsed_args.src_group, ignore_missing=False).id if parsed_args.src_group: LOG.warning( _("The %(old)s option is deprecated, " "please use %(new)s instead."), { 'old': '--src-group', 'new': '--remote-group' }, ) elif not (parsed_args.remote_ip is None and parsed_args.src_ip is None): attrs['remote_ip_prefix'] = (parsed_args.remote_ip or parsed_args.src_ip) if parsed_args.src_ip: LOG.warning( _("The %(old)s option is deprecated, " "please use %(new)s instead."), { 'old': '--src-ip', 'new': '--remote-ip' }, ) elif attrs['ethertype'] == 'IPv4': attrs['remote_ip_prefix'] = '0.0.0.0/0' attrs['security_group_id'] = security_group_id if parsed_args.project is not None: identity_client = self.app.client_manager.identity project_id = identity_common.find_project( identity_client, parsed_args.project, parsed_args.project_domain, ).id attrs['tenant_id'] = project_id # Create and show the security group rule. obj = client.create_security_group_rule(**attrs) display_columns, columns = _get_columns(obj) data = utils.get_item_properties(obj, columns) return (display_columns, data)
def take_action(self, parsed_args): identity_client = self.app.client_manager.identity auth_ref = self.app.client_manager.auth_ref role = None role_domain_id = None if parsed_args.role_domain: role_domain_id = common.find_domain(identity_client, parsed_args.role_domain).id if parsed_args.role: role = utils.find_resource( identity_client.roles, parsed_args.role, domain_id=role_domain_id ) user = None if parsed_args.user: user = common.find_user( identity_client, parsed_args.user, parsed_args.user_domain, ) elif parsed_args.authuser: if auth_ref: user = common.find_user( identity_client, auth_ref.user_id ) system = None if parsed_args.system: system = parsed_args.system domain = None if parsed_args.domain: domain = common.find_domain( identity_client, parsed_args.domain, ) project = None if parsed_args.project: project = common.find_project( identity_client, common._get_token_resource(identity_client, 'project', parsed_args.project), parsed_args.project_domain, ) elif parsed_args.authproject: if auth_ref: project = common.find_project( identity_client, auth_ref.project_id ) group = None if parsed_args.group: group = common.find_group( identity_client, parsed_args.group, parsed_args.group_domain, ) include_names = True if parsed_args.names else False effective = True if parsed_args.effective else False columns = ( 'Role', 'User', 'Group', 'Project', 'Domain', 'System', 'Inherited' ) inherited_to = 'projects' if parsed_args.inherited else None data = identity_client.role_assignments.list( domain=domain, user=user, group=group, project=project, system=system, role=role, effective=effective, os_inherit_extension_inherited_to=inherited_to, include_names=include_names) data_parsed = [] for assignment in data: # Removing the extra "scope" layer in the assignment json scope = assignment.scope if 'project' in scope: if include_names: prj = '@'.join([scope['project']['name'], scope['project']['domain']['name']]) setattr(assignment, 'project', prj) else: setattr(assignment, 'project', scope['project']['id']) assignment.domain = '' assignment.system = '' elif 'domain' in scope: if include_names: setattr(assignment, 'domain', scope['domain']['name']) else: setattr(assignment, 'domain', scope['domain']['id']) assignment.project = '' assignment.system = '' elif 'system' in scope: # NOTE(lbragstad): If, or when, keystone supports role # assignments on subsets of a system, this will have to evolve # to handle that case instead of hardcoding to the entire # system. setattr(assignment, 'system', 'all') assignment.domain = '' assignment.project = '' else: assignment.system = '' assignment.domain = '' assignment.project = '' inherited = scope.get('OS-INHERIT:inherited_to') == 'projects' assignment.inherited = inherited del assignment.scope if hasattr(assignment, 'user'): if include_names: usr = '******'.join([assignment.user['name'], assignment.user['domain']['name']]) setattr(assignment, 'user', usr) else: setattr(assignment, 'user', assignment.user['id']) assignment.group = '' elif hasattr(assignment, 'group'): if include_names: grp = '@'.join([assignment.group['name'], assignment.group['domain']['name']]) setattr(assignment, 'group', grp) else: setattr(assignment, 'group', assignment.group['id']) assignment.user = '' else: assignment.user = '' assignment.group = '' if hasattr(assignment, 'role'): if include_names: # TODO(henry-nash): If this is a domain specific role it # would be good show this as role@domain, although this # domain info is not yet included in the response from the # server. Although we could get it by re-reading the role # from the ID, let's wait until the server does the right # thing. setattr(assignment, 'role', assignment.role['name']) else: setattr(assignment, 'role', assignment.role['id']) else: assignment.role = '' # Creating a tuple from data object fields # (including the blank ones) data_parsed.append(self._as_tuple(assignment)) return columns, tuple(data_parsed)
def take_action(self, parsed_args): share_client = self.app.client_manager.share identity_client = self.app.client_manager.identity # TODO(gouthamr): Add support for ~name, ~description # export_location filtering if parsed_args.long: columns = SHARE_ATTRIBUTES column_headers = SHARE_ATTRIBUTES_HEADERS else: columns = [ 'id', 'name', 'size', 'share_proto', 'status', 'is_public', 'share_type_name', 'host', 'availability_zone' ] column_headers = [ 'ID', 'Name', 'Size', 'Share Proto', 'Status', 'Is Public', 'Share Type Name', 'Host', 'Availability Zone' ] project_id = None if parsed_args.project: project_id = identity_common.find_project( identity_client, parsed_args.project, parsed_args.project_domain).id user_id = None if parsed_args.user: user_id = identity_common.find_user(identity_client, parsed_args.user, parsed_args.user_domain).id # set value of 'all_tenants' when using project option all_tenants = bool(parsed_args.project) or parsed_args.all_projects share_type_id = None if parsed_args.share_type: share_type_id = apiutils.find_resource(share_client.share_types, parsed_args.share_type).id snapshot_id = None if parsed_args.snapshot: snapshot_id = apiutils.find_resource(share_client.share_snapshots, parsed_args.snapshot).id share_network_id = None if parsed_args.share_network: share_network_id = apiutils.find_resource( share_client.share_networks, parsed_args.share_network).id share_group_id = None if parsed_args.share_group: share_group_id = apiutils.find_resource(share_client.share_groups, parsed_args.share_group).id share_server_id = None if parsed_args.share_server: share_server_id = apiutils.find_resource( share_client.share_servers, parsed_args.share_server).id search_opts = { 'all_tenants': all_tenants, 'is_public': parsed_args.public, 'metadata': utils.extract_key_value_options(parsed_args.property), 'extra_specs': utils.extract_key_value_options(parsed_args.extra_spec), 'limit': parsed_args.limit, 'name': parsed_args.name, 'status': parsed_args.status, 'host': parsed_args.host, 'share_server_id': share_server_id, 'share_network_id': share_network_id, 'share_type_id': share_type_id, 'snapshot_id': snapshot_id, 'share_group_id': share_group_id, 'project_id': project_id, 'user_id': user_id, 'offset': parsed_args.marker, } # NOTE(vkmc) We implemented sorting and filtering in manilaclient # but we will use the one provided by osc data = share_client.shares.list(search_opts=search_opts) data = oscutils.sort_items(data, parsed_args.sort, str) return (column_headers, (oscutils.get_item_properties( s, columns, formatters={'Metadata': oscutils.format_dict}, ) for s in data))
def _get_attrs(client_manager, parsed_args, is_create=True): attrs = {} if 'name' in parsed_args and parsed_args.name is not None: attrs['name'] = str(parsed_args.name) if is_create: if 'project' in parsed_args and parsed_args.project is not None: identity_client = client_manager.identity project_id = identity_common.find_project( identity_client, parsed_args.project, parsed_args.project_domain, ).id attrs['tenant_id'] = project_id client = client_manager.network attrs['network_id'] = client.find_network(parsed_args.network, ignore_missing=False).id if parsed_args.subnet_pool is not None: subnet_pool = client.find_subnet_pool(parsed_args.subnet_pool, ignore_missing=False) attrs['subnetpool_id'] = subnet_pool.id if parsed_args.use_default_subnet_pool: attrs['use_default_subnetpool'] = True if parsed_args.prefix_length is not None: attrs['prefixlen'] = parsed_args.prefix_length if parsed_args.subnet_range is not None: attrs['cidr'] = parsed_args.subnet_range if parsed_args.ip_version is not None: attrs['ip_version'] = parsed_args.ip_version if parsed_args.ipv6_ra_mode is not None: attrs['ipv6_ra_mode'] = parsed_args.ipv6_ra_mode if parsed_args.ipv6_address_mode is not None: attrs['ipv6_address_mode'] = parsed_args.ipv6_address_mode if 'gateway' in parsed_args and parsed_args.gateway is not None: gateway = parsed_args.gateway.lower() if not is_create and gateway == 'auto': msg = _("Auto option is not available for Subnet Set. " "Valid options are <ip-address> or none") raise exceptions.CommandError(msg) elif gateway != 'auto': if gateway == 'none': attrs['gateway_ip'] = None else: attrs['gateway_ip'] = gateway if ('allocation_pools' in parsed_args and parsed_args.allocation_pools is not None): attrs['allocation_pools'] = parsed_args.allocation_pools if parsed_args.dhcp: attrs['enable_dhcp'] = True elif parsed_args.no_dhcp: attrs['enable_dhcp'] = False if ('dns_nameservers' in parsed_args and parsed_args.dns_nameservers is not None): attrs['dns_nameservers'] = parsed_args.dns_nameservers if 'host_routes' in parsed_args and parsed_args.host_routes is not None: # Change 'gateway' entry to 'nexthop' to match the API attrs['host_routes'] = convert_entries_to_nexthop( parsed_args.host_routes) return attrs
def take_action(self, parsed_args): identity_client = self.app.client_manager.identity image_client = self.app.client_manager.image for deadopt in self.deadopts: if getattr(parsed_args, deadopt.replace('-', '_'), None): raise exceptions.CommandError( _("ERROR: --%s was given, which is an Image v1 option" " that is no longer supported in Image v2") % deadopt) # Build an attribute dict from the parsed args, only include # attributes that were actually set on the command line kwargs = {} copy_attrs = ('name', 'id', 'container_format', 'disk_format', 'min_disk', 'min_ram', 'tags', 'visibility') for attr in copy_attrs: if attr in parsed_args: val = getattr(parsed_args, attr, None) if val: # Only include a value in kwargs for attributes that # are actually present on the command line kwargs[attr] = val # properties should get flattened into the general kwargs if getattr(parsed_args, 'properties', None): for k, v in six.iteritems(parsed_args.properties): kwargs[k] = str(v) # Handle exclusive booleans with care # Avoid including attributes in kwargs if an option is not # present on the command line. These exclusive booleans are not # a single value for the pair of options because the default must be # to do nothing when no options are present as opposed to always # setting a default. if parsed_args.protected: kwargs['protected'] = True if parsed_args.unprotected: kwargs['protected'] = False if parsed_args.public: kwargs['visibility'] = 'public' if parsed_args.private: kwargs['visibility'] = 'private' if parsed_args.community: kwargs['visibility'] = 'community' if parsed_args.shared: kwargs['visibility'] = 'shared' # Handle deprecated --owner option project_arg = parsed_args.project if parsed_args.owner: project_arg = parsed_args.owner LOG.warning( _('The --owner option is deprecated, ' 'please use --project instead.')) if project_arg: kwargs['owner'] = common.find_project( identity_client, project_arg, parsed_args.project_domain, ).id # open the file first to ensure any failures are handled before the # image is created fp = gc_utils.get_data_file(parsed_args) info = {} if fp is not None and parsed_args.volume: raise exceptions.CommandError( _("Uploading data and using " "container are not allowed at " "the same time")) if fp is None and parsed_args.file: LOG.warning(_("Failed to get an image file.")) return {}, {} if parsed_args.owner: kwargs['owner'] = common.find_project( identity_client, parsed_args.owner, parsed_args.project_domain, ).id # sign an image using a given local private key file if parsed_args.sign_key_path or parsed_args.sign_cert_id: if not parsed_args.file: msg = (_("signing an image requires the --file option, " "passing files via stdin when signing is not " "supported.")) raise exceptions.CommandError(msg) if (len(parsed_args.sign_key_path) < 1 or len(parsed_args.sign_cert_id) < 1): msg = (_("'sign-key-path' and 'sign-cert-id' must both be " "specified when attempting to sign an image.")) raise exceptions.CommandError(msg) else: sign_key_path = parsed_args.sign_key_path sign_cert_id = parsed_args.sign_cert_id signer = image_signer.ImageSigner() try: pw = utils.get_password( self.app.stdin, prompt=("Please enter private key password, leave " "empty if none: "), confirm=False) if not pw or len(pw) < 1: pw = None signer.load_private_key(sign_key_path, password=pw) except Exception: msg = (_("Error during sign operation: private key could " "not be loaded.")) raise exceptions.CommandError(msg) signature = signer.generate_signature(fp) signature_b64 = b64encode(signature) kwargs['img_signature'] = signature_b64 kwargs['img_signature_certificate_uuid'] = sign_cert_id kwargs['img_signature_hash_method'] = signer.hash_method if signer.padding_method: kwargs['img_signature_key_type'] = signer.padding_method # If a volume is specified. if parsed_args.volume: volume_client = self.app.client_manager.volume source_volume = utils.find_resource( volume_client.volumes, parsed_args.volume, ) response, body = volume_client.volumes.upload_to_image( source_volume.id, parsed_args.force, parsed_args.name, parsed_args.container_format, parsed_args.disk_format, ) info = body['os-volume_upload_image'] try: info['volume_type'] = info['volume_type']['name'] except TypeError: info['volume_type'] = None else: image = image_client.images.create(**kwargs) if fp is not None: with fp: try: image_client.images.upload(image.id, fp) except Exception: # If the upload fails for some reason attempt to remove the # dangling queued image made by the create() call above but # only if the user did not specify an id which indicates # the Image already exists and should be left alone. try: if 'id' not in kwargs: image_client.images.delete(image.id) except Exception: pass # we don't care about this one raise # now, throw the upload exception again # update the image after the data has been uploaded image = image_client.images.get(image.id) if not info: info = _format_image(image) return zip(*sorted(six.iteritems(info)))
def take_action(self, parsed_args): identity_client = self.app.client_manager.identity if parsed_args.user: user = common.find_user( identity_client, parsed_args.user, parsed_args.user_domain, ) elif parsed_args.group: group = common.find_group( identity_client, parsed_args.group, parsed_args.group_domain, ) if parsed_args.domain: domain = common.find_domain( identity_client, parsed_args.domain, ) elif parsed_args.project: project = common.find_project( identity_client, parsed_args.project, parsed_args.project_domain, ) # no user or group specified, list all roles in the system if not parsed_args.user and not parsed_args.group: columns = ('ID', 'Name') data = identity_client.roles.list() elif parsed_args.user and parsed_args.domain: columns = ('ID', 'Name', 'Domain', 'User') data = identity_client.roles.list( user=user, domain=domain, os_inherit_extension_inherited=parsed_args.inherited) for user_role in data: user_role.user = user.name user_role.domain = domain.name elif parsed_args.user and parsed_args.project: columns = ('ID', 'Name', 'Project', 'User') data = identity_client.roles.list( user=user, project=project, os_inherit_extension_inherited=parsed_args.inherited) for user_role in data: user_role.user = user.name user_role.project = project.name elif parsed_args.user: columns = ('ID', 'Name') data = identity_client.roles.list( user=user, domain='default', os_inherit_extension_inherited=parsed_args.inherited) elif parsed_args.group and parsed_args.domain: columns = ('ID', 'Name', 'Domain', 'Group') data = identity_client.roles.list( group=group, domain=domain, os_inherit_extension_inherited=parsed_args.inherited) for group_role in data: group_role.group = group.name group_role.domain = domain.name elif parsed_args.group and parsed_args.project: columns = ('ID', 'Name', 'Project', 'Group') data = identity_client.roles.list( group=group, project=project, os_inherit_extension_inherited=parsed_args.inherited) for group_role in data: group_role.group = group.name group_role.project = project.name else: sys.stderr.write("Error: If a user or group is specified, either " "--domain or --project must also be specified to " "list role grants.\n") return ([], []) return (columns, (utils.get_item_properties( s, columns, formatters={}, ) for s in data))
def take_action(self, parsed_args): share_client = self.app.client_manager.share identity_client = self.app.client_manager.identity share_server_id = None if parsed_args.share_server: share_server_id = osc_utils.find_resource( share_client.share_servers, parsed_args.share_server).id share_group_type = None if parsed_args.share_group_type: share_group_type = osc_utils.find_resource( share_client.share_group_types, parsed_args.share_group_type).id snapshot = None if parsed_args.snapshot: snapshot = apiutils.find_resource(share_client.share_snapshots, parsed_args.snapshot).id share_network = None if parsed_args.share_network: share_network = osc_utils.find_resource( share_client.share_networks, parsed_args.share_network).id project_id = None if parsed_args.project: project_id = identity_common.find_project( identity_client, parsed_args.project, parsed_args.project_domain).id columns = [ 'ID', 'Name', 'Status', 'Description', ] search_opts = { 'all_tenants': parsed_args.all_projects, 'name': parsed_args.name, 'status': parsed_args.status, 'share_server_id': share_server_id, 'share_group_type': share_group_type, 'snapshot': snapshot, 'host': parsed_args.host, 'share_network': share_network, 'project_id': project_id, 'limit': parsed_args.limit, 'offset': parsed_args.marker, } if share_client.api_version >= api_versions.APIVersion("2.36"): search_opts['name~'] = getattr(parsed_args, 'name~') search_opts['description~'] = getattr(parsed_args, 'description~') search_opts['description'] = parsed_args.description elif (parsed_args.description or getattr(parsed_args, 'name~') or getattr(parsed_args, 'description~')): raise exceptions.CommandError( "Pattern based filtering (name~, description~ and description)" " is only available with manila API version >= 2.36") if parsed_args.all_projects: columns.append('Project ID') share_groups = share_client.share_groups.list(search_opts=search_opts) data = (osc_utils.get_dict_properties(share_group._info, columns) for share_group in share_groups) return (columns, data)
def take_action(self, parsed_args): identity_client = self.app.client_manager.identity client = self.app.client_manager.network columns = ( 'id', 'name', 'status', 'is_admin_state_up', 'is_distributed', 'is_ha', 'project_id', ) column_headers = ( 'ID', 'Name', 'Status', 'State', 'Distributed', 'HA', 'Project', ) args = {} if parsed_args.name is not None: args['name'] = parsed_args.name if parsed_args.enable: args['admin_state_up'] = True args['is_admin_state_up'] = True elif parsed_args.disable: args['admin_state_up'] = False args['is_admin_state_up'] = False if parsed_args.project: project_id = identity_common.find_project( identity_client, parsed_args.project, parsed_args.project_domain, ).id args['tenant_id'] = project_id args['project_id'] = project_id _tag.get_tag_filtering_args(parsed_args, args) if parsed_args.agent is not None: agent = client.get_agent(parsed_args.agent) data = client.agent_hosted_routers(agent) # NOTE: Networking API does not support filtering by parameters, # so we need filtering in the client side. data = [d for d in data if self._filter_match(d, args)] else: data = client.routers(**args) if parsed_args.long: columns = columns + ( 'routes', 'external_gateway_info', ) column_headers = column_headers + ( 'Routes', 'External gateway info', ) # availability zone will be available only when # router_availability_zone extension is enabled if client.find_extension("router_availability_zone"): columns = columns + ( 'availability_zones', ) column_headers = column_headers + ( 'Availability zones', ) columns = columns + ('tags',) column_headers = column_headers + ('Tags',) return (column_headers, (utils.get_item_properties( s, columns, formatters=_formatters, ) for s in data))
def _get_attrs(client_manager, parsed_args): attrs = {} # Handle deprecated options # NOTE(dtroyer): --device-id and --host-id were deprecated in Mar 2016. # Do not remove before 3.x release or Mar 2017. if parsed_args.device_id: attrs['device_id'] = parsed_args.device_id LOG.warning( _('The --device-id option is deprecated, ' 'please use --device instead.')) if parsed_args.host_id: attrs['binding:host_id'] = parsed_args.host_id LOG.warning( _('The --host-id option is deprecated, ' 'please use --host instead.')) if parsed_args.description is not None: attrs['description'] = parsed_args.description if parsed_args.device: attrs['device_id'] = parsed_args.device if parsed_args.device_owner is not None: attrs['device_owner'] = parsed_args.device_owner if parsed_args.enable: attrs['admin_state_up'] = True if parsed_args.disable: attrs['admin_state_up'] = False if parsed_args.vnic_type is not None: attrs['binding:vnic_type'] = parsed_args.vnic_type if parsed_args.host: attrs['binding:host_id'] = parsed_args.host if parsed_args.mac_address is not None: attrs['mac_address'] = parsed_args.mac_address if parsed_args.dns_domain is not None: attrs['dns_domain'] = parsed_args.dns_domain if parsed_args.dns_name is not None: attrs['dns_name'] = parsed_args.dns_name # It is possible that name is not updated during 'port set' if parsed_args.name is not None: attrs['name'] = str(parsed_args.name) # The remaining options do not support 'port set' command, so they require # additional check if 'network' in parsed_args and parsed_args.network is not None: attrs['network_id'] = parsed_args.network if 'project' in parsed_args and parsed_args.project is not None: # TODO(singhj): since 'project' logic is common among # router, network, port etc., maybe move it to a common file. identity_client = client_manager.identity project_id = identity_common.find_project( identity_client, parsed_args.project, parsed_args.project_domain, ).id attrs['tenant_id'] = project_id if parsed_args.disable_port_security: attrs['port_security_enabled'] = False if parsed_args.enable_port_security: attrs['port_security_enabled'] = True if 'no_qos_policy' in parsed_args and parsed_args.no_qos_policy: attrs['qos_policy_id'] = None if parsed_args.qos_policy: attrs['qos_policy_id'] = client_manager.network.find_qos_policy( parsed_args.qos_policy, ignore_missing=False).id return attrs
def take_action(self, parsed_args): network_client = self.app.client_manager.network identity_client = self.app.client_manager.identity columns = ( 'id', 'name', 'mac_address', 'fixed_ips', 'status', ) column_headers = ( 'ID', 'Name', 'MAC Address', 'Fixed IP Addresses', 'Status', ) filters = {} if parsed_args.long: columns += ('security_group_ids', 'device_owner', 'tags') column_headers += ('Security Groups', 'Device Owner', 'Tags') if parsed_args.device_owner is not None: filters['device_owner'] = parsed_args.device_owner if parsed_args.device_id is not None: filters['device_id'] = parsed_args.device_id if parsed_args.router: _router = network_client.find_router(parsed_args.router, ignore_missing=False) filters['device_id'] = _router.id if parsed_args.server: compute_client = self.app.client_manager.compute server = utils.find_resource(compute_client.servers, parsed_args.server) filters['device_id'] = server.id if parsed_args.network: network = network_client.find_network(parsed_args.network, ignore_missing=False) filters['network_id'] = network.id if parsed_args.mac_address: filters['mac_address'] = parsed_args.mac_address if parsed_args.project: project_id = identity_common.find_project( identity_client, parsed_args.project, parsed_args.project_domain, ).id filters['tenant_id'] = project_id filters['project_id'] = project_id if parsed_args.fixed_ip: filters['fixed_ips'] = _prepare_filter_fixed_ips( self.app.client_manager, parsed_args) _tag.get_tag_filtering_args(parsed_args, filters) data = network_client.ports(**filters) headers, attrs = utils.calculate_header_and_attrs( column_headers, columns, parsed_args) return (headers, (utils.get_item_properties( s, attrs, formatters=_formatters, ) for s in data))
def take_action(self, parsed_args): volume_client = self.app.client_manager.volume compute_client = self.app.client_manager.compute identity_client = self.app.client_manager.identity if parsed_args.long: columns = [ 'ID', 'Name', 'Status', 'Size', 'Volume Type', 'Bootable', 'Attachments', 'Metadata', ] column_headers = copy.deepcopy(columns) column_headers[4] = 'Type' column_headers[6] = 'Attached to' column_headers[7] = 'Properties' else: columns = [ 'ID', 'Name', 'Status', 'Size', 'Attachments', ] column_headers = copy.deepcopy(columns) column_headers[4] = 'Attached to' # Cache the server list server_cache = {} try: for s in compute_client.servers.list(): server_cache[s.id] = s except Exception: # Just forget it if there's any trouble pass AttachmentsColumnWithCache = functools.partial( AttachmentsColumn, server_cache=server_cache) project_id = None if parsed_args.project: project_id = identity_common.find_project( identity_client, parsed_args.project, parsed_args.project_domain).id user_id = None if parsed_args.user: user_id = identity_common.find_user(identity_client, parsed_args.user, parsed_args.user_domain).id # set value of 'all_tenants' when using project option all_projects = bool(parsed_args.project) or parsed_args.all_projects search_opts = { 'all_tenants': all_projects, 'project_id': project_id, 'user_id': user_id, 'name': parsed_args.name, 'status': parsed_args.status, } data = volume_client.volumes.list( search_opts=search_opts, marker=parsed_args.marker, limit=parsed_args.limit, ) column_headers = utils.backward_compat_col_lister( column_headers, parsed_args.columns, {'Display Name': 'Name'}) return (column_headers, (utils.get_item_properties( s, columns, formatters={'Metadata': format_columns.DictColumn, 'Attachments': AttachmentsColumnWithCache}, ) for s in data))
def take_action_network(self, client, parsed_args): network_client = self.app.client_manager.network identity_client = self.app.client_manager.identity columns = ( 'id', 'floating_ip_address', 'fixed_ip_address', 'port_id', 'floating_network_id', 'project_id', ) headers = ( 'ID', 'Floating IP Address', 'Fixed IP Address', 'Port', 'Floating Network', 'Project', ) if parsed_args.long: columns = columns + ( 'router_id', 'status', 'description', ) headers = headers + ( 'Router', 'Status', 'Description', ) query = {} if parsed_args.network is not None: network = network_client.find_network(parsed_args.network, ignore_missing=False) query['floating_network_id'] = network.id if parsed_args.port is not None: port = network_client.find_port(parsed_args.port, ignore_missing=False) query['port_id'] = port.id if parsed_args.fixed_ip_address is not None: query['fixed_ip_address'] = parsed_args.fixed_ip_address if parsed_args.status: query['status'] = parsed_args.status if parsed_args.project is not None: project = identity_common.find_project( identity_client, parsed_args.project, parsed_args.project_domain, ) query['tenant_id'] = project.id query['project_id'] = project.id if parsed_args.router is not None: router = network_client.find_router(parsed_args.router, ignore_missing=False) query['router_id'] = router.id data = client.ips(**query) return (headers, (utils.get_item_properties( s, columns, formatters={}, ) for s in data))
def take_action(self, parsed_args): self.log.debug('take_action(%s)', parsed_args) identity_client = self.app.client_manager.identity if (not parsed_args.user and not parsed_args.domain and not parsed_args.group and not parsed_args.project): return role = utils.find_resource( identity_client.roles, parsed_args.role, ) if parsed_args.user and parsed_args.domain: user = common.find_user( identity_client, parsed_args.user, ) domain = common.find_domain( identity_client, parsed_args.domain, ) identity_client.roles.grant( role.id, user=user.id, domain=domain.id, ) elif parsed_args.user and parsed_args.project: user = common.find_user( identity_client, parsed_args.user, ) project = common.find_project( identity_client, parsed_args.project, ) identity_client.roles.grant( role.id, user=user.id, project=project.id, ) elif parsed_args.group and parsed_args.domain: group = common.find_group( identity_client, parsed_args.group, ) domain = common.find_domain( identity_client, parsed_args.domain, ) identity_client.roles.grant( role.id, group=group.id, domain=domain.id, ) elif parsed_args.group and parsed_args.project: group = common.find_group( identity_client, parsed_args.group, ) project = common.find_project( identity_client, parsed_args.project, ) identity_client.roles.grant( role.id, group=group.id, project=project.id, ) else: sys.stderr.write("Role not added, incorrect set of arguments \ provided. See openstack --help for more details\n") return
def take_action_network(self, client, parsed_args): identity_client = self.app.client_manager.identity if parsed_args.long: columns = ( 'id', 'name', 'status', 'project_id', 'is_admin_state_up', 'is_shared', 'subnet_ids', 'provider_network_type', 'is_router_external', 'availability_zones', 'tags', ) column_headers = ( 'ID', 'Name', 'Status', 'Project', 'State', 'Shared', 'Subnets', 'Network Type', 'Router Type', 'Availability Zones', 'Tags', ) elif parsed_args.agent_id: columns = ('id', 'name', 'subnet_ids') column_headers = ( 'ID', 'Name', 'Subnets', ) client = self.app.client_manager.network dhcp_agent = client.get_agent(parsed_args.agent_id) data = client.dhcp_agent_hosting_networks(dhcp_agent) return (column_headers, (utils.get_item_properties( s, columns, formatters=_formatters, ) for s in data)) else: columns = ('id', 'name', 'subnet_ids') column_headers = ( 'ID', 'Name', 'Subnets', ) args = {} if parsed_args.external: args['router:external'] = True args['is_router_external'] = True elif parsed_args.internal: args['router:external'] = False args['is_router_external'] = False if parsed_args.name is not None: args['name'] = parsed_args.name if parsed_args.enable: args['admin_state_up'] = True args['is_admin_state_up'] = True elif parsed_args.disable: args['admin_state_up'] = False args['is_admin_state_up'] = False if parsed_args.project: project = identity_common.find_project( identity_client, parsed_args.project, parsed_args.project_domain, ) args['tenant_id'] = project.id args['project_id'] = project.id if parsed_args.share: args['shared'] = True args['is_shared'] = True elif parsed_args.no_share: args['shared'] = False args['is_shared'] = False if parsed_args.status: args['status'] = parsed_args.status if parsed_args.provider_network_type: args['provider:network_type'] = parsed_args.provider_network_type args['provider_network_type'] = parsed_args.provider_network_type if parsed_args.physical_network: args['provider:physical_network'] = parsed_args.physical_network args['provider_physical_network'] = parsed_args.physical_network if parsed_args.segmentation_id: args['provider:segmentation_id'] = parsed_args.segmentation_id args['provider_segmentation_id'] = parsed_args.segmentation_id _tag.get_tag_filtering_args(parsed_args, args) data = client.networks(**args) return (column_headers, (utils.get_item_properties( s, columns, formatters=_formatters, ) for s in data))
def take_action_network(self, client, parsed_args): identity_client = self.app.client_manager.identity if parsed_args.long: columns = ( 'id', 'name', 'status', 'tenant_id', 'admin_state_up', 'shared', 'subnets', 'provider_network_type', 'router:external', 'availability_zones', ) column_headers = ( 'ID', 'Name', 'Status', 'Project', 'State', 'Shared', 'Subnets', 'Network Type', 'Router Type', 'Availability Zones', ) else: columns = ( 'id', 'name', 'subnets' ) column_headers = ( 'ID', 'Name', 'Subnets', ) args = {} if parsed_args.external: args['router:external'] = True elif parsed_args.internal: args['router:external'] = False if parsed_args.name is not None: args['name'] = parsed_args.name if parsed_args.enable: args['admin_state_up'] = True elif parsed_args.disable: args['admin_state_up'] = False if parsed_args.project: project = identity_common.find_project( identity_client, parsed_args.project, parsed_args.project_domain, ) args['tenant_id'] = project.id if parsed_args.share: args['shared'] = True elif parsed_args.no_share: args['shared'] = False if parsed_args.status: args['status'] = parsed_args.status data = client.networks(**args) return (column_headers, (utils.get_item_properties( s, columns, formatters=_formatters, ) for s in data))
def take_action(self, parsed_args): mgr = self.app.client_manager if parsed_args.network is None: parsed_args.network = parsed_args.name.split('-', 1)[0] if parsed_args.dns_name is None: parsed_args.dns_name = parsed_args.name.split('-', 1)[1] # Identify network network = mgr.network.find_network(parsed_args.network, ignore_missing=False) # Identify project project = find_project( mgr.identity, (network.project_id if parsed_args.project is None else parsed_args.project)) # Create subnet if mgr.network.find_subnet(parsed_args.name): raise CommandError('Subnet %s already exists' % parsed_args.name) subnet = mgr.network.create_subnet( name=parsed_args.name, project_id=project.id, network_id=network.id, ip_version=6, prefixlen=parsed_args.prefix_length, use_default_subnet_pool=True, enable_dhcp=False, ) mgr.network.update_subnet( subnet, gateway_ip=None, allocation_pools=[], ) # Create port if mgr.network.find_port(parsed_args.name): raise CommandError('Port %s already exists' % parsed_args.name) port = mgr.network.create_port( name=parsed_args.name, project_id=project.id, network_id=network.id, dns_name=parsed_args.dns_name, description="Routing port", allowed_address_pairs=[{ 'ip_address': subnet.cidr }], ) nexthop = next(x['ip_address'] for x in port.fixed_ips if valid_ipv6(x['ip_address'])) # Create route router = mgr.network.find_router('internal-external', ignore_missing=False) routes = [{ 'destination': subnet.cidr, 'nexthop': nexthop, }] mgr.network.update_router( router, routes=(router.routes + routes), ) return zip( *{ 'name': parsed_args.name, 'project_id': project.id, 'network_id': network.id, 'subnet_id': subnet.id, 'port_id': port.id, 'dns_name': parsed_args.dns_name, 'cidr': subnet.cidr, 'fixed_ips': format_list_of_dicts(port.fixed_ips), 'dns_assignment': format_list_of_dicts(port.dns_assignment), 'routes': format_list_of_dicts(routes), }.items())
def take_action(self, parsed_args): identity_client = self.app.client_manager.identity image_client = self.app.client_manager.image for deadopt in self.deadopts: if getattr(parsed_args, deadopt.replace('-', '_'), None): raise exceptions.CommandError( _("ERROR: --%s was given, which is an Image v1 option" " that is no longer supported in Image v2") % deadopt) # Build an attribute dict from the parsed args, only include # attributes that were actually set on the command line kwargs = {} copy_attrs = ('name', 'id', 'container_format', 'disk_format', 'min_disk', 'min_ram', 'tags', 'visibility') for attr in copy_attrs: if attr in parsed_args: val = getattr(parsed_args, attr, None) if val: # Only include a value in kwargs for attributes that # are actually present on the command line kwargs[attr] = val # properties should get flattened into the general kwargs if getattr(parsed_args, 'properties', None): for k, v in parsed_args.properties.items(): kwargs[k] = str(v) # Handle exclusive booleans with care # Avoid including attributes in kwargs if an option is not # present on the command line. These exclusive booleans are not # a single value for the pair of options because the default must be # to do nothing when no options are present as opposed to always # setting a default. if parsed_args.protected: kwargs['is_protected'] = True if parsed_args.unprotected: kwargs['is_protected'] = False if parsed_args.public: kwargs['visibility'] = 'public' if parsed_args.private: kwargs['visibility'] = 'private' if parsed_args.community: kwargs['visibility'] = 'community' if parsed_args.shared: kwargs['visibility'] = 'shared' if parsed_args.project: kwargs['owner_id'] = common.find_project( identity_client, parsed_args.project, parsed_args.project_domain, ).id if parsed_args.use_import: kwargs['use_import'] = True # open the file first to ensure any failures are handled before the # image is created. Get the file name (if it is file, and not stdin) # for easier further handling. (fp, fname) = get_data_file(parsed_args) info = {} if fp is not None and parsed_args.volume: raise exceptions.CommandError(_("Uploading data and using " "container are not allowed at " "the same time")) if fp is None and parsed_args.file: LOG.warning(_("Failed to get an image file.")) return {}, {} elif fname: kwargs['filename'] = fname elif fp: kwargs['validate_checksum'] = False kwargs['data'] = fp # sign an image using a given local private key file if parsed_args.sign_key_path or parsed_args.sign_cert_id: if not parsed_args.file: msg = (_("signing an image requires the --file option, " "passing files via stdin when signing is not " "supported.")) raise exceptions.CommandError(msg) if (len(parsed_args.sign_key_path) < 1 or len(parsed_args.sign_cert_id) < 1): msg = (_("'sign-key-path' and 'sign-cert-id' must both be " "specified when attempting to sign an image.")) raise exceptions.CommandError(msg) else: sign_key_path = parsed_args.sign_key_path sign_cert_id = parsed_args.sign_cert_id signer = image_signer.ImageSigner() try: pw = utils.get_password( self.app.stdin, prompt=("Please enter private key password, leave " "empty if none: "), confirm=False) if not pw or len(pw) < 1: pw = None else: # load_private_key() requires the password to be # passed as bytes pw = pw.encode() signer.load_private_key( sign_key_path, password=pw) except Exception: msg = (_("Error during sign operation: private key " "could not be loaded.")) raise exceptions.CommandError(msg) signature = signer.generate_signature(fp) signature_b64 = b64encode(signature) kwargs['img_signature'] = signature_b64 kwargs['img_signature_certificate_uuid'] = sign_cert_id kwargs['img_signature_hash_method'] = signer.hash_method if signer.padding_method: kwargs['img_signature_key_type'] = \ signer.padding_method # If a volume is specified. if parsed_args.volume: volume_client = self.app.client_manager.volume source_volume = utils.find_resource( volume_client.volumes, parsed_args.volume, ) response, body = volume_client.volumes.upload_to_image( source_volume.id, parsed_args.force, parsed_args.name, parsed_args.container_format, parsed_args.disk_format, ) info = body['os-volume_upload_image'] try: info['volume_type'] = info['volume_type']['name'] except TypeError: info['volume_type'] = None else: image = image_client.create_image(**kwargs) if not info: info = _format_image(image) return zip(*sorted(info.items()))
def take_action(self, parsed_args): identity_client = self.app.client_manager.identity image_client = self.app.client_manager.image for deadopt in self.deadopts: if getattr(parsed_args, deadopt.replace('-', '_'), None): raise exceptions.CommandError( _("ERROR: --%s was given, which is an Image v1 option" " that is no longer supported in Image v2") % deadopt) kwargs = {} copy_attrs = ('architecture', 'container_format', 'disk_format', 'file', 'instance_id', 'kernel_id', 'locations', 'min_disk', 'min_ram', 'name', 'os_distro', 'os_version', 'prefix', 'progress', 'ramdisk_id', 'tags', 'visibility') for attr in copy_attrs: if attr in parsed_args: val = getattr(parsed_args, attr, None) if val is not None: # Only include a value in kwargs for attributes that are # actually present on the command line kwargs[attr] = val # Properties should get flattened into the general kwargs if getattr(parsed_args, 'properties', None): for k, v in six.iteritems(parsed_args.properties): kwargs[k] = str(v) # Handle exclusive booleans with care # Avoid including attributes in kwargs if an option is not # present on the command line. These exclusive booleans are not # a single value for the pair of options because the default must be # to do nothing when no options are present as opposed to always # setting a default. if parsed_args.protected: kwargs['protected'] = True if parsed_args.unprotected: kwargs['protected'] = False if parsed_args.public: kwargs['visibility'] = 'public' if parsed_args.private: kwargs['visibility'] = 'private' if parsed_args.community: kwargs['visibility'] = 'community' if parsed_args.shared: kwargs['visibility'] = 'shared' # Handle deprecated --owner option project_arg = parsed_args.project if parsed_args.owner: project_arg = parsed_args.owner LOG.warning( _('The --owner option is deprecated, ' 'please use --project instead.')) project_id = None if project_arg: project_id = common.find_project( identity_client, project_arg, parsed_args.project_domain, ).id kwargs['owner'] = project_id image = utils.find_resource(image_client.images, parsed_args.image) activation_status = None if parsed_args.deactivate: image_client.images.deactivate(image.id) activation_status = "deactivated" if parsed_args.activate: image_client.images.reactivate(image.id) activation_status = "activated" membership_group_args = ('accept', 'reject', 'pending') membership_status = [ status for status in membership_group_args if getattr(parsed_args, status) ] if membership_status: # If a specific project is not passed, assume we want to update # our own membership if not project_id: project_id = self.app.client_manager.auth_ref.project_id # The mutually exclusive group of the arg parser ensure we have at # most one item in the membership_status list. if membership_status[0] != 'pending': membership_status[0] += 'ed' # Glance expects the past form image_client.image_members.update(image.id, project_id, membership_status[0]) if parsed_args.tags: # Tags should be extended, but duplicates removed kwargs['tags'] = list(set(image.tags).union(set(parsed_args.tags))) try: image = image_client.images.update(image.id, **kwargs) except Exception: if activation_status is not None: LOG.info(_("Image %(id)s was %(status)s."), { 'id': image.id, 'status': activation_status }) raise
def take_action(self, parsed_args): identity_client = self.app.client_manager.identity image_client = self.app.client_manager.image for deadopt in self.deadopts: if getattr(parsed_args, deadopt.replace('-', '_'), None): raise exceptions.CommandError( _("ERROR: --%s was given, which is an Image v1 option" " that is no longer supported in Image v2") % deadopt) # Build an attribute dict from the parsed args, only include # attributes that were actually set on the command line kwargs = {} copy_attrs = ('name', 'id', 'container_format', 'disk_format', 'min_disk', 'min_ram', 'tags') for attr in copy_attrs: if attr in parsed_args: val = getattr(parsed_args, attr, None) if val: # Only include a value in kwargs for attributes that # are actually present on the command line kwargs[attr] = val # properties should get flattened into the general kwargs if getattr(parsed_args, 'properties', None): for k, v in six.iteritems(parsed_args.properties): kwargs[k] = str(v) # Handle exclusive booleans with care # Avoid including attributes in kwargs if an option is not # present on the command line. These exclusive booleans are not # a single value for the pair of options because the default must be # to do nothing when no options are present as opposed to always # setting a default. if parsed_args.protected: kwargs['protected'] = True if parsed_args.unprotected: kwargs['protected'] = False if parsed_args.public: kwargs['visibility'] = 'public' if parsed_args.private: kwargs['visibility'] = 'private' # Handle deprecated --owner option project_arg = parsed_args.project if parsed_args.owner: project_arg = parsed_args.owner self.log.warning(_( 'The --owner option is deprecated, ' 'please use --project instead.' )) if project_arg: kwargs['owner'] = common.find_project( identity_client, project_arg, parsed_args.project_domain, ).id # open the file first to ensure any failures are handled before the # image is created fp = gc_utils.get_data_file(parsed_args) info = {} if fp is not None and parsed_args.volume: raise exceptions.CommandError(_("Uploading data and using " "container are not allowed at " "the same time")) if fp is None and parsed_args.file: self.log.warning(_("Failed to get an image file.")) return {}, {} if parsed_args.owner: kwargs['owner'] = common.find_project( identity_client, parsed_args.owner, parsed_args.project_domain, ).id # If a volume is specified. if parsed_args.volume: volume_client = self.app.client_manager.volume source_volume = utils.find_resource( volume_client.volumes, parsed_args.volume, ) response, body = volume_client.volumes.upload_to_image( source_volume.id, parsed_args.force, parsed_args.name, parsed_args.container_format, parsed_args.disk_format, ) info = body['os-volume_upload_image'] try: info['volume_type'] = info['volume_type']['name'] except TypeError: info['volume_type'] = None else: image = image_client.images.create(**kwargs) if fp is not None: with fp: try: image_client.images.upload(image.id, fp) except Exception as e: # If the upload fails for some reason attempt to remove the # dangling queued image made by the create() call above but # only if the user did not specify an id which indicates # the Image already exists and should be left alone. try: if 'id' not in kwargs: image_client.images.delete(image.id) except Exception: pass # we don't care about this one raise e # now, throw the upload exception again # update the image after the data has been uploaded image = image_client.images.get(image.id) if not info: info = _format_image(image) return zip(*sorted(six.iteritems(info)))
def take_action_network(self, client, parsed_args): # Get the security group ID to hold the rule. security_group_id = client.find_security_group(parsed_args.group, ignore_missing=False).id # Build the create attributes. attrs = {} attrs['protocol'] = self._get_protocol(parsed_args) if parsed_args.description is not None: attrs['description'] = parsed_args.description # NOTE(rtheis): A direction must be specified and ingress # is the default. if parsed_args.ingress or not parsed_args.egress: attrs['direction'] = 'ingress' if parsed_args.egress: attrs['direction'] = 'egress' # NOTE(rtheis): Use ethertype specified else default based # on IP protocol. attrs['ethertype'] = self._get_ethertype(parsed_args, attrs['protocol']) # NOTE(rtheis): Validate the port range and ICMP type and code. # It would be ideal if argparse could do this. if parsed_args.dst_port and (parsed_args.icmp_type or parsed_args.icmp_code): msg = _('Argument --dst-port not allowed with arguments ' '--icmp-type and --icmp-code') raise exceptions.CommandError(msg) if parsed_args.icmp_type is None and parsed_args.icmp_code is not None: msg = _('Argument --icmp-type required with argument --icmp-code') raise exceptions.CommandError(msg) is_icmp_protocol = _is_icmp_protocol(attrs['protocol']) if not is_icmp_protocol and (parsed_args.icmp_type or parsed_args.icmp_code): msg = _('ICMP IP protocol required with arguments ' '--icmp-type and --icmp-code') raise exceptions.CommandError(msg) # NOTE(rtheis): For backwards compatibility, continue ignoring # the destination port range when an ICMP IP protocol is specified. if parsed_args.dst_port and not is_icmp_protocol: attrs['port_range_min'] = parsed_args.dst_port[0] attrs['port_range_max'] = parsed_args.dst_port[1] if parsed_args.icmp_type is not None and parsed_args.icmp_type >= 0: attrs['port_range_min'] = parsed_args.icmp_type if parsed_args.icmp_code is not None and parsed_args.icmp_code >= 0: attrs['port_range_max'] = parsed_args.icmp_code if parsed_args.remote_group is not None: attrs['remote_group_id'] = client.find_security_group( parsed_args.remote_group, ignore_missing=False).id elif parsed_args.remote_ip is not None: attrs['remote_ip_prefix'] = parsed_args.remote_ip elif attrs['ethertype'] == 'IPv4': attrs['remote_ip_prefix'] = '0.0.0.0/0' elif attrs['ethertype'] == 'IPv6': attrs['remote_ip_prefix'] = '::/0' attrs['security_group_id'] = security_group_id if parsed_args.project is not None: identity_client = self.app.client_manager.identity project_id = identity_common.find_project( identity_client, parsed_args.project, parsed_args.project_domain, ).id attrs['tenant_id'] = project_id # Create and show the security group rule. obj = client.create_security_group_rule(**attrs) display_columns, columns = _get_columns(obj) data = utils.get_item_properties(obj, columns) return (display_columns, data)
def take_action(self, parsed_args): identity_client = self.app.client_manager.identity image_client = self.app.client_manager.image for deadopt in self.deadopts: if getattr(parsed_args, deadopt.replace('-', '_'), None): raise exceptions.CommandError( _("ERROR: --%s was given, which is an Image v1 option" " that is no longer supported in Image v2") % deadopt) kwargs = {} copy_attrs = ('architecture', 'container_format', 'disk_format', 'file', 'instance_id', 'kernel_id', 'locations', 'min_disk', 'min_ram', 'name', 'os_distro', 'os_version', 'prefix', 'progress', 'ramdisk_id', 'tags') for attr in copy_attrs: if attr in parsed_args: val = getattr(parsed_args, attr, None) if val: # Only include a value in kwargs for attributes that are # actually present on the command line kwargs[attr] = val # Properties should get flattened into the general kwargs if getattr(parsed_args, 'properties', None): for k, v in six.iteritems(parsed_args.properties): kwargs[k] = str(v) # Handle exclusive booleans with care # Avoid including attributes in kwargs if an option is not # present on the command line. These exclusive booleans are not # a single value for the pair of options because the default must be # to do nothing when no options are present as opposed to always # setting a default. if parsed_args.protected: kwargs['protected'] = True if parsed_args.unprotected: kwargs['protected'] = False if parsed_args.public: kwargs['visibility'] = 'public' if parsed_args.private: kwargs['visibility'] = 'private' # Handle deprecated --owner option project_arg = parsed_args.project if parsed_args.owner: project_arg = parsed_args.owner self.log.warning(_( 'The --owner option is deprecated, ' 'please use --project instead.' )) if project_arg: kwargs['owner'] = common.find_project( identity_client, project_arg, parsed_args.project_domain, ).id # Checks if anything that requires getting the image if not (kwargs or parsed_args.deactivate or parsed_args.activate): self.log.warning(_("No arguments specified")) return {}, {} image = utils.find_resource( image_client.images, parsed_args.image) activation_status = None if parsed_args.deactivate: image_client.images.deactivate(image.id) activation_status = "deactivated" if parsed_args.activate: image_client.images.reactivate(image.id) activation_status = "activated" # Check if need to do the actual update if not kwargs: return {}, {} if parsed_args.tags: # Tags should be extended, but duplicates removed kwargs['tags'] = list(set(image.tags).union(set(parsed_args.tags))) try: image = image_client.images.update(image.id, **kwargs) except Exception as e: if activation_status is not None: print("Image %s was %s." % (image.id, activation_status)) raise e