def Run(self, args): project = properties.VALUES.core.project.GetOrFail() memberships = base.ListMemberships(project) if not memberships: raise exceptions.Error('No Memberships available in Hub.') # User should choose an existing membership if not provide one if not args.membership: index = console_io.PromptChoice( options=memberships, message= 'Please specify a membership to delete configmanagement:\n') membership = memberships[index] else: membership = args.membership if membership not in memberships: raise exceptions.Error( 'Membership {} is not in Hub.'.format(membership)) client = core_apis.GetClientInstance('gkehub', 'v1alpha1') msg = client.MESSAGES_MODULE applied_config = msg.ConfigManagementFeatureSpec.MembershipConfigsValue.AdditionalProperty( key=membership, value=msg.MembershipConfig()) m_configs = msg.ConfigManagementFeatureSpec.MembershipConfigsValue( additionalProperties=[applied_config]) self.RunCommand( 'configmanagement_feature_spec.membership_configs', configmanagementFeatureSpec=msg.ConfigManagementFeatureSpec( membershipConfigs=m_configs))
def _get_or_prompt_membership(args, project): """Retrieves the membership name from args or prompts the user. Args: args: command line args project: project id Returns: membership: A membership name Raises: Error, if specified membership could not be found """ memberships = base.ListMemberships(project) if not memberships: raise exceptions.Error('No Memberships available in Hub.') # User should choose an existing membership if this arg wasn't provided if not args.membership: index = console_io.PromptChoice( options=memberships, message='Please specify a membership to upgrade:\n') membership = memberships[index] else: membership = args.membership if membership not in memberships: raise exceptions.Error( 'Membership {} is not in Hub.'.format(membership)) return membership
def Run(self, args): try: project_id = properties.VALUES.core.project.GetOrFail() memberships = feature_base.ListMemberships(project_id) name = 'projects/{0}/locations/global/features/{1}'.format( project_id, self.FEATURE_NAME) response = feature_base.GetFeature(name) except apitools_exceptions.HttpUnauthorizedError as e: raise exceptions.Error( 'You are not authorized to see the status of {} ' 'Feature from project [{}]. Underlying error: {}'.format( self.FEATURE_DISPLAY_NAME, project_id, e)) except apitools_exceptions.HttpNotFoundError as e: raise exceptions.Error( '{} Feature for project [{}] is not enabled'.format( self.FEATURE_DISPLAY_NAME, project_id)) if not memberships: return None acm_status = [] feature_state_memberships = parse_feature_state_memberships(response) for name in memberships: cluster = ConfigmanagementFeatureState(name) if name not in feature_state_memberships: acm_status.append(cluster) continue md = feature_state_memberships[name] fs = md.value.configmanagementFeatureState if fs and fs.membershipConfig and fs.membershipConfig.version: cluster.version = fs.membershipConfig.version acm_status.append(cluster) return acm_status
def Run(self, args): log.warning( 'Are you sure you want to update your config membership? Any ' 'differences in your MCI and MCS resources between the old and ' 'new config membership can trigger load balancer updates which ' 'could cause traffic interruption.') console_io.PromptContinue(default=False, cancel_on_no=True) project = properties.VALUES.core.project.GetOrFail() if not args.config_membership: memberships = base.ListMemberships(project) if not memberships: raise exceptions.Error('No Memberships available in Hub.') index = console_io.PromptChoice( options=memberships, message='Please specify a config membership:\n') config_membership = memberships[index] else: config_membership = args.config_membership config_membership = ( 'projects/{0}/locations/global/memberships/{1}'.format( project, os.path.basename(config_membership))) self.RunCommand( 'multiclusteringress_feature_spec.config_membership', multiclusteringressFeatureSpec=( base.CreateMultiClusterIngressFeatureSpec(config_membership)))
def Run(self, args): try: project_id = properties.VALUES.core.project.GetOrFail() memberships = feature_base.ListMemberships(project_id) name = 'projects/{0}/locations/global/features/{1}'.format( project_id, self.FEATURE_NAME) response = feature_base.GetFeature(name) except apitools_exceptions.HttpUnauthorizedError as e: raise exceptions.Error( 'You are not authorized to see the status of {} ' 'Feature from project [{}]. Underlying error: {}'.format( self.FEATURE_DISPLAY_NAME, project_id, e)) except apitools_exceptions.HttpNotFoundError as e: raise exceptions.Error( '{} Feature for project [{}] is not enabled'.format( self.FEATURE_DISPLAY_NAME, project_id)) if not memberships: return None if response.featureState is None or response.featureState.detailsByMembership is None: membership_details = [] else: membership_details = response.featureState.detailsByMembership.additionalProperties acm_status = [] acm_errors = [] fs_memberships = { os.path.basename(membership_detail.key): membership_detail for membership_detail in membership_details } for name in memberships: cluster = ConfigmanagementFeatureState(name) if name not in fs_memberships: acm_status.append(cluster) continue md = fs_memberships[name] fs = md.value.configmanagementFeatureState # (b/153587485) Show FeatureState.code if it's not OK # as it indicates an unreachable cluster or a dated syncState.code if md.value.code is None: cluster.config_sync = 'CODE_UNSPECIFIED' elif md.value.code.name != 'OK': cluster.config_sync = md.value.code.name else: # operator errors could occur regardless of the deployment_state if has_operator_error(fs): append_error(name, fs.operatorState.errors, acm_errors) # (b/154174276, b/156293028) # check operator_state to see if nomos has been installed if not has_operator_state(fs): cluster.config_sync = 'OPERATOR_STATE_UNSPECIFIED' else: cluster.config_sync = fs.operatorState.deploymentState.name if cluster.config_sync == 'INSTALLED': cluster.update_sync_state(fs) if has_config_sync_error(fs): append_error(name, fs.configSyncState.syncState.errors, acm_errors) cluster.update_policy_controller_state(fs) acm_status.append(cluster) return {'acm_errors': acm_errors, 'acm_status': acm_status}
def Run(self, args): # Get Hub memberships (cluster registered with Hub) from GCP Project. project = args.project or properties.VALUES.core.project.GetOrFail() memberships = base.ListMemberships(project) if not memberships: raise exceptions.Error('No Memberships available in Hub.') # Acquire membership. global membership # Prompt user for an existing hub membership if none is provided. if not args.membership: index = 0 if len(memberships) > 1: index = console_io.PromptChoice( options=memberships, message='Please specify a membership to apply {}:\n'. format(args.config)) membership = memberships[index] sys.stderr.write('Selecting membership [{}].\n'.format(membership)) else: membership = args.membership if membership not in memberships: raise exceptions.Error( 'Membership {} is not in Hub.'.format(membership)) # Load config YAML file. loaded_config = file_parsers.YamlConfigFile( file_path=args.config, item_type=file_parsers.LoginConfigObject) # Create new identity service feature spec. client = core_apis.GetClientInstance('gkehub', 'v1alpha1') msg = client.MESSAGES_MODULE member_config = _parse_config(loaded_config, msg) # UpdateFeature uses the patch method to update member_configs map, hence # there's no need to get the existing feature spec. applied_config = msg.IdentityServiceFeatureSpec.MemberConfigsValue.AdditionalProperty( key=membership, value=member_config) m_configs = msg.IdentityServiceFeatureSpec.MemberConfigsValue( additionalProperties=[applied_config]) # Execute update to apply new identity service feature spec to membership. self.RunCommand( 'identityservice_feature_spec.member_configs', identityserviceFeatureSpec=msg.IdentityServiceFeatureSpec( memberConfigs=m_configs))
def Run(self, args): project = properties.VALUES.core.project.GetOrFail() if not args.config_membership: memberships = base.ListMemberships(project) if not memberships: raise exceptions.Error('No Memberships available in Hub.') index = console_io.PromptChoice( options=memberships, message='Please specify a config membership:\n') config_membership = memberships[index] else: config_membership = args.config_membership config_membership = ('projects/{0}/locations/global/memberships/{1}' .format(project, os.path.basename(config_membership))) self.RunCommand(args, multiclusteringressFeatureSpec=( base.CreateMultiClusterIngressFeatureSpec( config_membership)))
def Run(self, args): project = properties.VALUES.core.project.GetOrFail() memberships = base.ListMemberships(project) if not memberships: raise exceptions.Error('No Memberships available in Hub.') # User should choose an existing membership if not provide one global membership if not args.membership: index = console_io.PromptChoice( options=memberships, message='Please specify a membership to apply {}:\n'.format( args.config)) membership = memberships[index] else: membership = args.membership if membership not in memberships: raise exceptions.Error( 'Membership {} is not in Hub.'.format(membership)) try: loaded_cm = yaml.load_path(args.config) except yaml.Error as e: raise exceptions.Error( 'Invalid config yaml file {}'.format(args.config), e) _validate_meta(loaded_cm) client = core_apis.GetClientInstance('gkehub', 'v1alpha1') msg = client.MESSAGES_MODULE config_sync = _parse_config_sync(loaded_cm, msg) policy_controller = _parse_policy_controller(loaded_cm, msg) applied_config = msg.ConfigManagementFeatureSpec.MembershipConfigsValue.AdditionalProperty( key=membership, value=msg.MembershipConfig( version=self._get_backfill_version(membership), configSync=config_sync, policyController=policy_controller)) # UpdateFeature uses patch method to update membership_configs map, # there's no need to get the existing feature spec m_configs = msg.ConfigManagementFeatureSpec.MembershipConfigsValue( additionalProperties=[applied_config]) self.RunCommand( 'configmanagement_feature_spec.membership_configs', configmanagementFeatureSpec=msg.ConfigManagementFeatureSpec( membershipConfigs=m_configs))
def Run(self, args): # Get Hub memberships (cluster registered with Hub) from GCP Project. try: project = args.project or properties.VALUES.core.project.GetOrFail( ) memberships = base.ListMemberships(project) name = 'projects/{0}/locations/global/features/{1}'.format( project, self.FEATURE_NAME) response = base.GetFeature(name) except apitools_exceptions.HttpUnauthorizedError as e: raise exceptions.Error( 'Not authorized to see Feature {} status from project [{}]. ' 'Underlying error: {}'.format(self.FEATURE_DISPLAY_NAME, project, e)) except apitools_exceptions.HttpNotFoundError as e: raise exceptions.Error( '{} Feature for project [{}] is not enabled'.format( self.FEATURE_DISPLAY_NAME, project)) if not memberships: log.status.Print('No Memberships available in Hub.') return {} feature_spec_memberships = state_util.parse_feature_spec_memberships( response) feature_state_memberships = state_util.parse_feature_state_memberships( response) # Populate and print out status of memberships. ais_status = [] for name in memberships: cluster_in_spec = None cluster_in_state = None if name in feature_spec_memberships: cluster_in_spec = feature_spec_memberships[name] if name in feature_state_memberships: cluster_in_state = feature_state_memberships[name].value cluster_out = state_util.IdentityServiceMembershipState( name, cluster_in_spec=cluster_in_spec, cluster_in_state=cluster_in_state) ais_status.append(cluster_out) else: ais_status.append({name: 'config not applied'}) return {'Membership Status for Identity Service': ais_status}