示例#1
0
    def _SetUpEnvTest(self):
        config1 = kubeconfig.Kubeconfig.Default()
        cluster1 = kubeconfig.Cluster('cluster1',
                                      'https://1.1.1.1',
                                      ca_data='FAKE_CA_DATA')
        cluster2 = kubeconfig.Cluster('cluster2',
                                      'https://2.2.2.2',
                                      ca_data=None)
        user = kubeconfig.User('user',
                               cert_data='FAKECERTDATA',
                               key_data='FAKE_KEY_DATA')
        context = kubeconfig.Context('context', 'cluster1', 'user')
        config1.clusters['cluster1'] = cluster1
        config1.clusters['cluster2'] = cluster2
        config1.users['user'] = user
        config1.contexts['context'] = context
        config1.SetCurrentContext('context')

        config2 = kubeconfig.Kubeconfig.Default()
        modified_cluster1 = kubeconfig.Cluster('cluster1',
                                               'https://2.2.2.2',
                                               ca_data=None)
        other_cluster2 = kubeconfig.Cluster('other_cluster2',
                                            'https://3.3.3.3',
                                            ca_data='FAKE_CA_DATA')
        user = kubeconfig.User('user',
                               cert_data='FAKECERTDATA',
                               key_data='FAKE_KEY_DATA')
        other_context = kubeconfig.Context('other_context', 'cluster1', 'user')
        config2.clusters['cluster1'] = modified_cluster1
        config2.clusters['other_cluster2'] = other_cluster2
        config2.users['user'] = user
        config2.contexts['other_context'] = other_context
        config2.SetCurrentContext('other_context')

        self.expected_configs = {
            '/some/path1': config1,
            '/some/path2': config2
        }

        def _KubeconfigLoadFromFile(path):
            if path in self.expected_configs:
                return self.expected_configs[path]
            else:
                raise kubeconfig.Error('Invalid path', path)

        self.StartObjectPatch(kubeconfig.Kubeconfig,
                              'LoadFromFile',
                              side_effect=_KubeconfigLoadFromFile)
示例#2
0
    def GenKubeconfig(self):
        """Generate kubeconfig for this cluster."""
        context = self.kube_context
        kubeconfig = kconfig.Kubeconfig.Default()
        cluster_kwargs = {}
        user_kwargs = {
            'auth_provider': self.auth_provider,
        }
        if self.has_ca_cert:
            cluster_kwargs['ca_data'] = self.ca_data
        if self.has_cert_data:
            user_kwargs['cert_data'] = self.client_cert_data
            user_kwargs['key_data'] = self.client_key_data

        # Use same key for context, cluster, and user
        kubeconfig.contexts[context] = kconfig.Context(context, context,
                                                       context)
        kubeconfig.users[context] = kconfig.User(context, **user_kwargs)
        kubeconfig.clusters[context] = kconfig.Cluster(context, self.server,
                                                       **cluster_kwargs)
        kubeconfig.SetCurrentContext(context)
        kubeconfig.SaveToFile()

        path = kconfig.Kubeconfig.DefaultPath()
        log.debug('Saved kubeconfig to %s', path)
        log.status.Print(
            KUBECONFIG_USAGE_FMT.format(cluster=self.cluster_name,
                                        context=context))
示例#3
0
    def testExistingKubeconfig(self):
        path = kconfig.Kubeconfig.DefaultPath()
        file_utils.MakeDir(os.path.dirname(path))
        with open(path, 'w') as fp:
            fp.write(_EXISTING_KUBECONFIG)
        existing = kconfig.Kubeconfig.Default()

        cluster = self._RunningCluster()
        config = c_util.ClusterConfig.Persist(cluster, self.PROJECT_ID)

        kubeconfig = kconfig.Kubeconfig.Default()
        cluster = kconfig.Cluster(config.kube_context,
                                  config.server,
                                  ca_data=config.ca_data)
        user = kconfig.User(config.kube_context, auth_provider='gcp')
        context = kconfig.Context(config.kube_context, config.kube_context,
                                  config.kube_context)

        # verify added kubeconfig data is correct
        self.assertEqual(kubeconfig.clusters[config.kube_context], cluster)
        self.assertEqual(kubeconfig.users[config.kube_context], user)
        self.assertEqual(kubeconfig.contexts[config.kube_context], context)
        self.assertEqual(kubeconfig.current_context, config.kube_context)

        # verify purge clears cluster data from kubeconfig
        c_util.ClusterConfig.Purge(config.cluster_name, config.zone_id,
                                   config.project_id)
        # reload kubeconfig
        kubeconfig = kconfig.Kubeconfig.Default()
        # Purge unsets current-context if it was set to the deleted
        # cluster's context
        existing.SetCurrentContext('')
        self.assertEqual(kubeconfig._data, existing._data)
示例#4
0
    def testLoadStoreKubeconfig(self):
        kubeconfig = kconfig.Kubeconfig.Default()
        cluster1 = kconfig.Cluster('cluster1',
                                   'https://1.1.1.1',
                                   ca_data='FAKE_CA_DATA')
        cluster2 = kconfig.Cluster('cluster2', 'https://2.2.2.2', ca_data=None)
        user = kconfig.User('user',
                            cert_data='FAKECERTDATA',
                            key_data='FAKE_KEY_DATA')
        context = kconfig.Context('context', 'cluster1', 'user')
        kubeconfig.clusters['cluster1'] = cluster1
        kubeconfig.clusters['cluster2'] = cluster2
        kubeconfig.users['user'] = user
        kubeconfig.contexts['context'] = context

        kubeconfig.SaveToFile()

        # reload
        kubeconfig = kconfig.Kubeconfig.Default()
        self.assertEqual(kubeconfig.users[user['name']], user)
        self.assertEqual(kubeconfig.contexts[context['name']], context)
        for c in cluster1, cluster2:
            self.assertEqual(kubeconfig.clusters[c['name']], c)

        self.assertTrue(kubeconfig.clusters['cluster2']['cluster']
                        ['insecure-skip-tls-verify'])
def _ConnectGatewayKubeconfig(kubeconfig, cluster, context, cmd_path):
    """Generates the Connect Gateway kubeconfig entry.

  Args:
    kubeconfig: object, Kubeconfig object.
    cluster: object, Anthos Multi-cloud cluster.
    context: str, context for the kubeconfig entry.
    cmd_path: str, authentication provider command path.

  Raises:
      errors.MissingClusterField: cluster is missing required fields.
  """
    if cluster.fleet is None:
        raise errors.MissingClusterField('fleet')
    if cluster.fleet.membership is None:
        raise errors.MissingClusterField('fleet.membership')
    membership_resource = resources.REGISTRY.ParseRelativeName(
        cluster.fleet.membership,
        collection='gkehub.projects.locations.memberships')
    # Connect Gateway only supports project number.
    # TODO(b/198380839): Use the url with locations once rolled out.
    server = 'https://{}/v1/projects/{}/memberships/{}'.format(
        _GetConnectGatewayEndpoint(),
        project_util.GetProjectNumber(membership_resource.projectsId),
        membership_resource.membershipsId)
    user_kwargs = {'auth_provider': 'gcp', 'auth_provider_cmd_path': cmd_path}
    kubeconfig.users[context] = kubeconfig_util.User(context, **user_kwargs)
    kubeconfig.clusters[context] = gwkubeconfig_util.Cluster(context, server)
示例#6
0
    def testMergeKubeconfig(self):
        kubeconfig = kconfig.Kubeconfig.Default()
        cluster1 = kconfig.Cluster('cluster1',
                                   'https://1.1.1.1',
                                   ca_data='FAKE_CA_DATA')
        cluster2 = kconfig.Cluster('cluster2', 'https://2.2.2.2', ca_data=None)
        user = kconfig.User('user',
                            cert_data='FAKECERTDATA',
                            key_data='FAKE_KEY_DATA')
        context = kconfig.Context('context', 'cluster1', 'user')
        kubeconfig.clusters['cluster1'] = cluster1
        kubeconfig.clusters['cluster2'] = cluster2
        kubeconfig.users['user'] = user
        kubeconfig.contexts['context'] = context
        kubeconfig.SetCurrentContext('context')

        other_kubeconfig = kconfig.Kubeconfig.Default()
        modified_cluster1 = kconfig.Cluster('cluster1',
                                            'https://2.2.2.2',
                                            ca_data=None)
        other_cluster2 = kconfig.Cluster('other_cluster2',
                                         'https://3.3.3.3',
                                         ca_data='FAKE_CA_DATA')
        user = kconfig.User('user',
                            cert_data='FAKECERTDATA',
                            key_data='FAKE_KEY_DATA')
        other_context = kconfig.Context('other_context', 'cluster1', 'user')
        other_kubeconfig.clusters['cluster1'] = modified_cluster1
        other_kubeconfig.clusters['other_cluster2'] = other_cluster2
        other_kubeconfig.users['user'] = user
        other_kubeconfig.contexts['other_context'] = other_context
        other_kubeconfig.SetCurrentContext('other_context')

        kubeconfig.Merge(other_kubeconfig)
        self.assertEqual(kubeconfig.current_context, 'context')
        self.assertEqual(len(kubeconfig.users), 1)
        self.assertEqual(kubeconfig.users[user['name']], user)
        self.assertEqual(len(kubeconfig.contexts), 2)
        for c in context, other_context:
            self.assertEqual(kubeconfig.contexts[c['name']], c)
        self.assertEqual(len(kubeconfig.clusters), 3)
        for c in cluster1, cluster2, other_cluster2:
            self.assertEqual(kubeconfig.clusters[c['name']], c)
示例#7
0
 def testConnectToKubeconfigClusterWithSpecifiedContext(self, version):
     config = kubeconfig.Kubeconfig.Default()
     cluster = kubeconfig.Cluster('cluster1',
                                  'https://2.2.2.2',
                                  ca_data='=')
     user = kubeconfig.User('user', cert_data='aGF0', key_data='c2FsYWQ=')
     context = kubeconfig.Context('context', 'cluster1', 'user')
     config.clusters['cluster1'] = cluster
     config.users['user'] = user
     config.contexts['context'] = context
     config.SetCurrentContext('some_other_context')
     with connection_context._KubeconfigConnectionContext(
             config, 'run', version, 'context'):
         if six.PY3:
             self.assertEqual(
                 properties.VALUES.api_endpoint_overrides.run.Get(),
                 'https://2.2.2.2/')
         else:
             self.assertEqual(
                 properties.VALUES.api_endpoint_overrides.run.Get(),
                 'https://kubernetes.default/')
示例#8
0
 def testUserGCPAuthProvider(self):
     user = kconfig.User(name='user', auth_provider='gcp')
     self.assertIsNotNone(user)
     self.assertEqual(user['name'], 'user')
     self.assertEqual(user['user']['auth-provider']['name'], 'gcp')