Ejemplo n.º 1
0
 def Less(self, version1, version2, expected=True):
     semver1 = semver.SemVer(version1)
     semver2 = semver.SemVer(version2)
     self.assertEqual(expected, semver1 < semver2)
     self.assertEqual(expected, semver2 > semver1)
     self.assertEqual(not expected, semver1 >= semver2)
     self.assertEqual(not expected, semver2 <= semver1)
Ejemplo n.º 2
0
    def Matches(self, current_version, current_revision,
                component_updates_available):
        """Determines if this notification should be activated for this SDK.

    Args:
      current_version: str, The installed version of the SDK (i.e. 1.2.3)
      current_revision: long, The revision (from the component snapshot) that is
        currently installed.  This is a long int but formatted as an actual
        date in seconds (i.e 20151009132504).  It is *NOT* seconds since the
        epoch.
      component_updates_available: bool, True if there are updates available for
        some components that are currently installed.

    Returns:
      True if the notification should be activated, False to ignore it.
    """
        if (current_version is None and
            (self.start_version or self.end_version or self.version_regex)):
            # If we don't know what version we have, don't match a condition that
            # relies on specific version information.
            return False

        try:
            if (self.start_version and semver.SemVer(current_version) <
                    semver.SemVer(self.start_version)):
                return False
            if (self.end_version and semver.SemVer(current_version) >
                    semver.SemVer(self.end_version)):
                return False
        except semver.ParseError:
            # Failed to parse something, condition does not match.
            log.debug('Failed to parse semver, condition not matching.',
                      exc_info=True)
            return False

        if self.version_regex and not re.match(self.version_regex,
                                               current_version):
            return False

        if self.age is not None:
            if current_revision is None:
                # We don't know the current revision, not a match.
                return False
            try:
                now = time.time()
                last_updated = config.InstallationConfig.ParseRevisionAsSeconds(
                    current_revision)
                if now - last_updated < self.age:
                    return False
            except ValueError:
                # If we could not parse our current revision, don't match the age
                # condition.
                log.debug('Failed to parse revision, condition not matching.',
                          exc_info=True)
                return False

        if self.check_components and not component_updates_available:
            return False

        return True
Ejemplo n.º 3
0
 def Distance(self, version1, version2, expected):
     semver1 = semver.SemVer(version1)
     semver2 = semver.SemVer(version2)
     major, minor, patch = semver1.Distance(semver2)
     self.assertEqual(major, expected[0])
     self.assertEqual(minor, expected[1])
     self.assertEqual(patch, expected[2])
def _GetSemver(cluster):
    if cluster.controlPlane is None or cluster.controlPlane.version is None:
        raise errors.MissingClusterField('version')
    version = cluster.controlPlane.version
    # The dev version e.g. 1.21-next does not conform to semantic versioning.
    # Replace the -next suffix before parsing semver for version comparison.
    if version.endswith('-next'):
        v = version.replace('-next', '.0', 1)
        return semver.SemVer(v)
    return semver.SemVer(version)
Ejemplo n.º 5
0
    def testBadParse(self):
        errors = [
            None,
            1,
            '',
            '0',
            '0.0',
            '0.0.0.',
            '-asdf',
            '0-asdf',
            'a.b.c',
            '01.0.0',
            '0a.0b.0c',
            '0.0.0-01',
            '0.0.0-a.01',
            '0.0.0-.0.',
            '0.0.0-0.0.',
            '0.0.0-..',
        ]

        for e in errors:
            with self.assertRaises(semver.ParseError):
                r = semver.SemVer(e)
                print(r.major, r.minor, r.patch, r.prerelease, r.build)
                print(e)
def GenerateKubeconfig(cluster, context, cmd_path, cmd_args, private_ep=False):
    """Generates a kubeconfig entry for an Anthos Multi-cloud cluster.

  Args:
    cluster: object, Anthos Multi-cloud cluster.
    context: str, context for the kubeconfig entry.
    cmd_path: str, authentication provider command path.
    cmd_args: str, authentication provider command arguments.
    private_ep: bool, whether to use private VPC for authentication.

  Raises:
      Error: don't have the permission to open kubeconfig file.
  """
    kubeconfig = kubeconfig_util.Kubeconfig.Default()
    # Use the same key for context, cluster, and user.
    kubeconfig.contexts[context] = kubeconfig_util.Context(
        context, context, context)

    # Only default to use Connect Gateway for 1.21+.
    version = _GetSemver(cluster)
    if private_ep or version < semver.SemVer('1.21.0'):
        _CheckPreqs(private_endpoint=True)
        _PrivateVPCKubeconfig(kubeconfig, cluster, context, cmd_path, cmd_args)
    else:
        _CheckPreqs()
        _ConnectGatewayKubeconfig(kubeconfig, cluster, context, cmd_path)

    kubeconfig.SetCurrentContext(context)
    kubeconfig.SaveToFile()
    log.status.Print(
        'A new kubeconfig entry "{}" has been generated and set as the '
        'current context.'.format(context))
Ejemplo n.º 7
0
 def Convert(self, string):
   """Converts a SemVer object from string returns it."""
   if not string:
     return None
   try:
     parts = string.split('.')
     while len(parts) < 3:
       parts.append('0')
     string = '.'.join(parts)
     return semver.SemVer(string)
   except semver.ParseError as e:
     raise exceptions.ParseError(self.GetPresentationName(), _SubException(e))
Ejemplo n.º 8
0
def merge_config_sync(spec, config, version):
    """Merge configSync set in feature spec with the config template.

  ConfigSync has nested object structs need to be flatten.

  Args:
    spec: the ConfigManagementMembershipSpec message
    config: the dict loaded from full config template
    version: the version string of the membership
  """
    if not spec or not spec.configSync:
        return
    git = spec.configSync.git
    cs = config[utils.CONFIG_SYNC]
    if spec.configSync.enabled is not None:
        cs['enabled'] = spec.configSync.enabled
    else:
        # when enabled is no set in feature spec, it's determined by syncRepo
        if spec.configSync.git and git.syncRepo:
            cs['enabled'] = True
    if (not version or semver.SemVer(version) >= semver.SemVer(
            utils.PREVENT_DRIFT_VERSION)):
        if spec.configSync.preventDrift:
            cs['preventDrift'] = spec.configSync.preventDrift
    else:
        del cs['preventDrift']
    if spec.configSync.sourceFormat:
        cs['sourceFormat'] = spec.configSync.sourceFormat
    if not git:
        return
    if git.syncWaitSecs:
        cs['syncWait'] = git.syncWaitSecs
    for field in [
            'policyDir', 'httpsProxy', 'secretType', 'syncBranch', 'syncRepo',
            'syncRev', 'gcpServiceAccountEmail'
    ]:
        if hasattr(git, field) and getattr(git, field) is not None:
            cs[field] = getattr(git, field)
def ValidateClusterVersion(cluster):
    """Validates the cluster version.

  Args:
    cluster: object, Anthos Multi-cloud cluster.

  Raises:
      UnsupportedClusterVersion: cluster version is not supported.
      MissingClusterField: expected cluster field is missing.
  """
    version = _GetSemver(cluster)
    if version < semver.SemVer('1.20.0'):
        raise errors.UnsupportedClusterVersion(
            'The command get-credentials is supported in cluster version 1.20 '
            'and newer. For older versions, use get-kubeconfig.')
Ejemplo n.º 10
0
 def Equal(self, version1, version2, expected=True):
     semver1 = semver.SemVer(version1)
     semver2 = semver.SemVer(version2)
     self.assertEqual(expected, semver1 == semver2)
     self.assertEqual(not expected, semver1 != semver2)
Ejemplo n.º 11
0
def _VersionStrToSemanticVersion(version_str):
    """Parses version_str into semantic version."""
    return semver.SemVer(version_str)