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))
Beispiel #2
0
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
Beispiel #3
0
    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
Beispiel #4
0
    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)))
Beispiel #5
0
 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}
Beispiel #6
0
    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))
Beispiel #7
0
 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)))
Beispiel #8
0
  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))
Beispiel #9
0
    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}