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)
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
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)
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))
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))
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.')
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)
def _VersionStrToSemanticVersion(version_str): """Parses version_str into semantic version.""" return semver.SemVer(version_str)