Beispiel #1
0
def versions_for_member(feature, membership):
    """Parses the version fields from an ACM Feature for a given membership.

  Args:
    feature: A v1alpha, v1beta, or v1 ACM Feature.
    membership: The short membership name whose version to return.

  Returns:
    A tuple of the form (spec.version, state.spec.version), with unset versions
    defaulting to the empty string.
  """
    spec_version = None
    specs = client.HubClient.ToPyDict(feature.membershipSpecs)
    for full_membership, spec in specs.items():
        if util.MembershipShortname(full_membership) == membership:
            if spec is not None and spec.configmanagement is not None:
                spec_version = spec.configmanagement.version
            break

    state_version = None
    states = client.HubClient.ToPyDict(feature.membershipStates)
    for full_membership, state in states.items():
        if util.MembershipShortname(full_membership) == membership:
            if state is not None and state.configmanagement is not None:
                if state.configmanagement.membershipSpec is not None:
                    state_version = state.configmanagement.membershipSpec.version
            break

    return (spec_version or '', state_version or '')
Beispiel #2
0
 def Run(self, args):
     memberships = feature_base.ListMemberships()
     f = self.GetFeature()
     if not memberships:
         return None
     acm_status = []
     acm_errors = []
     feature_spec_memberships = {
         util.MembershipShortname(m): s
         for m, s in self.hubclient.ToPyDict(f.membershipSpecs).items()
         if s is not None and s.configmanagement is not None
     }
     feature_state_memberships = {
         util.MembershipShortname(m): s
         for m, s in self.hubclient.ToPyDict(f.membershipStates).items()
     }
     for name in memberships:
         cluster = ConfigmanagementFeatureState(name)
         if name not in feature_state_memberships:
             if name in feature_spec_memberships:
                 # (b/187846229) Show PENDING if feature spec is aware of
                 # this membership name but feature state is not
                 cluster.update_pending_state(
                     feature_spec_memberships[name], None)
             acm_status.append(cluster)
             continue
         md = feature_state_memberships[name]
         fs = md.configmanagement
         # (b/153587485) Show FeatureState.code if it's not OK
         # as it indicates an unreachable cluster or a dated syncState.code
         if md.state is None or md.state.code is None:
             cluster.config_sync = 'CODE_UNSPECIFIED'
         elif md.state.code.name != 'OK':
             cluster.config_sync = md.state.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 ACM/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)
                     cluster.update_hierarchy_controller_state(fs)
                     if name in feature_spec_memberships:
                         cluster.update_pending_state(
                             feature_spec_memberships[name].
                             configmanagement, fs.membershipSpec)
         acm_status.append(cluster)
     return {'acm_errors': acm_errors, 'acm_status': acm_status}
    def Run(self, args):
        f = self.GetFeature()
        new_version = args.version
        membership = _get_or_prompt_membership(args.membership)
        _, cluster_v = utils.versions_for_member(f, membership)

        if not self._validate_versions(membership, cluster_v, new_version):
            return
        console_io.PromptContinue(
            'You are about to change the {} Feature for membership {} from version "{}" to version '
            '"{}".'.format(self.feature.display_name, membership, cluster_v,
                           new_version),
            throw_if_unattended=True,
            cancel_on_no=True)

        patch = self.messages.MembershipFeatureSpec()
        # If there's an existing spec, copy it to leave the other fields intact.
        for full_name, spec in self.hubclient.ToPyDict(
                f.membershipSpecs).items():
            if util.MembershipShortname(
                    full_name) == membership and spec is not None:
                patch = spec
        if patch.configmanagement is None:
            patch.configmanagement = self.messages.ConfigManagementMembershipSpec(
            )
        patch.configmanagement.version = new_version

        f = self.messages.Feature(
            membershipSpecs=self.hubclient.ToMembershipSpecs(
                {self.MembershipResourceName(membership): patch}))
        self.Update(['membershipSpecs'], f)
def ListMemberships():
    """Lists Membership IDs in the fleet for the current project.

  Returns:
    A list of Membership resource IDs in the fleet.
  """
    client = core_apis.GetClientInstance('gkehub', 'v1beta1')
    response = client.projects_locations_memberships.List(
        client.MESSAGES_MODULE.GkehubProjectsLocationsMembershipsListRequest(
            parent=hub_base.HubCommand.LocationResourceName()))

    return [
        util.MembershipShortname(m.name) for m in response.resources
        if not _ClusterMissing(m.endpoint)
    ]
    def Run(self, args):
        memberships = feature_base.ListMemberships()
        f = self.GetFeature()

        acm_status = []
        feature_state_memberships = feature_state_memberships = {
            util.MembershipShortname(m): s
            for m, s in self.hubclient.ToPyDict(f.membershipStates).items()
        }
        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.configmanagement
            if fs and fs.membershipSpec and fs.membershipSpec.version:
                cluster.version = fs.membershipSpec.version
            acm_status.append(cluster)

        return acm_status
Beispiel #6
0
    def Run(self, args):
        # Get Hub memberships (cluster registered with fleet) from GCP Project.
        memberships = base.ListMemberships()
        if not memberships:
            raise exceptions.Error('No Memberships available in the fleet.')
        # User should choose an existing membership if not provide one
        membership = None
        if args.membership is None:
            index = console_io.PromptChoice(
                options=memberships,
                message='Please specify a membership to fetch the config:\n')
            membership = memberships[index]
        else:
            membership = args.membership
            if membership not in memberships:
                raise exceptions.Error(
                    'Membership {} is not in the fleet.'.format(membership))

        f = self.GetFeature()
        version = utils.get_backfill_version_from_feature(f, membership)
        membership_spec = None
        for full_name, spec in self.hubclient.ToPyDict(
                f.membershipSpecs).items():
            if util.MembershipShortname(
                    full_name) == membership and spec is not None:
                membership_spec = spec.configmanagement

        if membership_spec is None:
            log.status.Print(
                'Membership {} not initialized'.format(membership))

        # load the config template and merge with config has been applied to the
        # feature spec
        template = yaml.load(utils.APPLY_SPEC_VERSION_1)
        full_config = template['spec']
        merge_config_sync(membership_spec, full_config, version)
        merge_non_cs_components(membership_spec, full_config)

        return template