diff --git a/magnumclient/tests/v1/test_clusters.py b/magnumclient/tests/v1/test_clusters.py index 2286e062..e1e7f25b 100644 --- a/magnumclient/tests/v1/test_clusters.py +++ b/magnumclient/tests/v1/test_clusters.py @@ -245,6 +245,17 @@ class ClusterManagerTest(testtools.TestCase): self.assertEqual(expect, self.api.calls) self.assertTrue(cluster) + def test_cluster_create_with_keypair(self): + cluster_with_keypair = dict() + cluster_with_keypair.update(CREATE_CLUSTER) + cluster_with_keypair['keypair'] = 'test_key' + cluster = self.mgr.create(**cluster_with_keypair) + expect = [ + ('POST', '/v1/clusters', {}, cluster_with_keypair), + ] + self.assertEqual(expect, self.api.calls) + self.assertTrue(cluster) + def test_cluster_create_with_discovery_url(self): cluster_with_discovery = dict() cluster_with_discovery.update(CREATE_CLUSTER) diff --git a/magnumclient/tests/v1/test_clusters_shell.py b/magnumclient/tests/v1/test_clusters_shell.py index 72b4df92..f158273f 100644 --- a/magnumclient/tests/v1/test_clusters_shell.py +++ b/magnumclient/tests/v1/test_clusters_shell.py @@ -24,6 +24,7 @@ class FakeCluster(Cluster): def __init__(self, manager=None, info={}, **kwargs): Cluster.__init__(self, manager=manager, info=info) self.uuid = kwargs.get('uuid', 'x') + self.keypair = kwargs.get('keypair_id', 'x') self.name = kwargs.get('name', 'x') self.cluster_template_id = kwargs.get('cluster_template_id', 'x') self.stack_id = kwargs.get('stack_id', 'x') @@ -55,14 +56,14 @@ class ShellTest(shell_test_base.TestCommandLineArgument): mock_list.return_value = [FakeCluster()] self._test_arg_success( 'cluster-list --fields status,status,status,name', - keyword=('\n| uuid | name | node_count | ' + keyword=('\n| uuid | name | keypair_id | node_count | ' 'master_count | status |\n')) # Output should be - # +------+------+------------+--------------+--------+ - # | uuid | name | node_count | master_count | status | - # +------+------+------------+--------------+--------+ - # | x | x | x | x | x | - # +------+------+------------+--------------+--------+ + # +------+------+------------+--------------+--------------+--------+ + # | uuid | name | keypair_id | node_count | master_count | status | + # +------+------+------------+--------------+--------------+--------+ + # | x | x | x | x | x | x | + # +------+------+------------+--------------+--------------+--------+ self.assertTrue(mock_list.called) @mock.patch('magnumclient.v1.clusters.ClusterManager.list') @@ -102,6 +103,10 @@ class ShellTest(shell_test_base.TestCommandLineArgument): self._test_arg_success('cluster-create --cluster-template xxx') self.assertTrue(mock_create.called) + self._test_arg_success('cluster-create --cluster-template xxx ' + '--keypair-id x') + self.assertTrue(mock_create.called) + self._test_arg_success('cluster-create --name test ' '--cluster-template xxx') self.assertTrue(mock_create.called) @@ -149,6 +154,12 @@ class ShellTest(shell_test_base.TestCommandLineArgument): self._mandatory_arg_error) self.assertFalse(mock_create.called) + @mock.patch('magnumclient.v1.clusters.ClusterManager.create') + def test_cluster_create_failure_only_keypair(self, mock_create): + self._test_arg_failure('cluster-create --keypair-id test', + self._mandatory_arg_error) + self.assertFalse(mock_create.called) + @mock.patch('magnumclient.v1.clusters.ClusterManager.create') def test_cluster_create_failure_only_node_count(self, mock_create): self._test_arg_failure('cluster-create --node-count 1', diff --git a/magnumclient/tests/v1/test_clustertemplates.py b/magnumclient/tests/v1/test_clustertemplates.py index 366b28c9..af7f25ac 100644 --- a/magnumclient/tests/v1/test_clustertemplates.py +++ b/magnumclient/tests/v1/test_clustertemplates.py @@ -29,7 +29,6 @@ CLUSTERTEMPLATE1 = { 'image_id': 'clustertemplate1-image', 'master_flavor_id': 'm1.tiny', 'flavor_id': 'm1.small', - 'keypair_id': 'keypair1', 'external_network_id': 'd1f02cfb-d27f-4068-9332-84d907cb0e21', 'fixed_network': 'private', 'fixed_subnet': 'private-subnet', @@ -57,7 +56,6 @@ CLUSTERTEMPLATE2 = { 'image_id': 'clustertemplate2-image', 'flavor_id': 'm2.small', 'master_flavor_id': 'm2.tiny', - 'keypair_id': 'keypair2', 'external_network_id': 'd1f02cfb-d27f-4068-9332-84d907cb0e22', 'fixed_network': 'private2', 'network_driver': 'flannel', @@ -370,6 +368,23 @@ class ClusterTemplateManagerTest(testtools.TestCase): self.assertEqual(CLUSTERTEMPLATE1['docker_storage_driver'], cluster_template.docker_storage_driver) + def test_clustertemplate_create_with_keypair(self): + cluster_template_with_keypair = dict() + cluster_template_with_keypair.update(CREATE_CLUSTERTEMPLATE) + cluster_template_with_keypair['keypair_id'] = 'test_key' + + cluster_template = self.mgr.create(**cluster_template_with_keypair) + expect = [ + ('POST', '/v1/clustertemplates', {}, + cluster_template_with_keypair), + ] + self.assertEqual(expect, self.api.calls) + self.assertTrue(cluster_template) + self.assertEqual(CLUSTERTEMPLATE1['docker_volume_size'], + cluster_template.docker_volume_size) + self.assertEqual(CLUSTERTEMPLATE1['docker_storage_driver'], + cluster_template.docker_storage_driver) + def test_clustertemplate_create_fail(self): CREATE_CLUSTERTEMPLATE_FAIL = copy.deepcopy(CREATE_CLUSTERTEMPLATE) CREATE_CLUSTERTEMPLATE_FAIL["wrong_key"] = "wrong" diff --git a/magnumclient/v1/cluster_templates_shell.py b/magnumclient/v1/cluster_templates_shell.py index 353fbe17..c55102b4 100644 --- a/magnumclient/v1/cluster_templates_shell.py +++ b/magnumclient/v1/cluster_templates_shell.py @@ -30,16 +30,17 @@ def _show_cluster_template(cluster_template): @utils.arg('--image-id', required=True, metavar='<image-id>', - help='The name or UUID of the base image to customize for the bay.') + help='The name or UUID of the base image to customize for the ' + 'Cluster.') @utils.arg('--keypair-id', - required=True, + required=False, metavar='<keypair-id>', - help='The name or UUID of the SSH keypair to load into the' - ' Bay nodes.') + help='The name or UUID of the SSH keypair to load into the ' + 'Cluster nodes.') @utils.arg('--external-network-id', required=True, metavar='<external-network-id>', - help='The external Neutron network ID to connect to this bay' + help='The external Neutron network ID to connect to this Cluster' ' model.') @utils.arg('--coe', required=True, @@ -47,11 +48,11 @@ def _show_cluster_template(cluster_template): help='Specify the Container Orchestration Engine to use.') @utils.arg('--fixed-network', metavar='<fixed-network>', - help='The private Neutron network name to connect to this bay' + help='The private Neutron network name to connect to this Cluster' ' model.') @utils.arg('--fixed-subnet', metavar='<fixed-subnet>', - help='The private Neutron subnet name to connect to bay.') + help='The private Neutron subnet name to connect to Cluster.') @utils.arg('--network-driver', metavar='<network-driver>', help='The network driver name for instantiating container' @@ -67,11 +68,11 @@ def _show_cluster_template(cluster_template): @utils.arg('--flavor-id', metavar='<flavor-id>', default='m1.medium', - help='The nova flavor id to use when launching the bay.') + help='The nova flavor id to use when launching the Cluster.') @utils.arg('--master-flavor-id', metavar='<master-flavor-id>', help='The nova flavor id to use when launching the master node ' - 'of the bay.') + 'of the Cluster.') @utils.arg('--docker-volume-size', metavar='<docker-volume-size>', type=int, @@ -84,13 +85,13 @@ def _show_cluster_template(cluster_template): 'overlay. Default: devicemapper') @utils.arg('--http-proxy', metavar='<http-proxy>', - help='The http_proxy address to use for nodes in bay.') + help='The http_proxy address to use for nodes in Cluster.') @utils.arg('--https-proxy', metavar='<https-proxy>', - help='The https_proxy address to use for nodes in bay.') + help='The https_proxy address to use for nodes in Cluster.') @utils.arg('--no-proxy', metavar='<no-proxy>', - help='The no_proxy address to use for nodes in bay.') + help='The no_proxy address to use for nodes in Cluster.') @utils.arg('--labels', metavar='<KEY1=VALUE1,KEY2=VALUE2;KEY3=VALUE3...>', action='append', default=[], help='Arbitrary labels in the form of key=value pairs ' @@ -98,13 +99,13 @@ def _show_cluster_template(cluster_template): 'May be used multiple times.') @utils.arg('--tls-disabled', action='store_true', default=False, - help='Disable TLS in the Bay.') + help='Disable TLS in the Cluster.') @utils.arg('--public', action='store_true', default=False, help='Make cluster template public.') @utils.arg('--registry-enabled', action='store_true', default=False, - help='Enable docker registry in the Bay') + help='Enable docker registry in the Cluster') @utils.arg('--server-type', metavar='<server-type>', default='vm', @@ -113,11 +114,11 @@ def _show_cluster_template(cluster_template): 'default server type will be vm.') @utils.arg('--master-lb-enabled', action='store_true', default=False, - help='Indicates whether created bays should have a load balancer ' - 'for master nodes or not.') + help='Indicates whether created Clusters should have a load ' + 'balancer for master nodes or not.') @utils.arg('--floating-ip-enabled', action='store_true', default=True, - help='Indicates whether created bays should have a floating ip' + help='Indicates whether created Clusters should have a floating ip' 'or not.') def do_cluster_template_create(cs, args): """Create a cluster template.""" diff --git a/magnumclient/v1/clusters.py b/magnumclient/v1/clusters.py index b95973fc..5f41c1fb 100644 --- a/magnumclient/v1/clusters.py +++ b/magnumclient/v1/clusters.py @@ -18,6 +18,7 @@ from magnumclient.v1 import baseunit CREATION_ATTRIBUTES = baseunit.CREATION_ATTRIBUTES CREATION_ATTRIBUTES.append('cluster_template_id') CREATION_ATTRIBUTES.append('create_timeout') +CREATION_ATTRIBUTES.append('keypair') class Cluster(baseunit.BaseTemplate): diff --git a/magnumclient/v1/clusters_shell.py b/magnumclient/v1/clusters_shell.py index 7eae13db..b225ff3a 100644 --- a/magnumclient/v1/clusters_shell.py +++ b/magnumclient/v1/clusters_shell.py @@ -52,9 +52,9 @@ def _show_cluster(cluster): default=None, metavar='<fields>', help=_('Comma-separated list of fields to display. ' - 'Available fields: uuid, name, baymodel_id, stack_id, ' - 'status, master_count, node_count, links, ' - 'cluster_create_timeout' + 'Available fields: uuid, name, cluster_template_id, ' + 'stack_id, status, master_count, node_count, links, ' + 'create_timeout' ) ) def do_cluster_list(cs, args): @@ -62,12 +62,19 @@ def do_cluster_list(cs, args): clusters = cs.clusters.list(marker=args.marker, limit=args.limit, sort_key=args.sort_key, sort_dir=args.sort_dir) - columns = ['uuid', 'name', 'node_count', 'master_count', 'status'] + columns = [ + 'uuid', 'name', 'keypair', 'node_count', 'master_count', 'status' + ] columns += utils._get_list_table_columns_and_formatters( args.fields, clusters, exclude_fields=(c.lower() for c in columns))[0] + + labels = columns[:] + labels[2] = 'keypair_id' + utils.print_list(clusters, columns, {'versions': magnum_utils.print_list_field('versions')}, + field_labels=labels, sortby_index=None) @@ -78,6 +85,10 @@ def do_cluster_list(cs, args): required=True, metavar='<cluster_template>', help='ID or name of the cluster template.') +@utils.arg('--keypair-id', + metavar='<keypair_id>', + default=None, + help='Name of the keypair to use for this cluster.') @utils.arg('--node-count', metavar='<node-count>', type=int, @@ -104,6 +115,7 @@ def do_cluster_create(cs, args): opts = {} opts['name'] = args.name opts['cluster_template_id'] = cluster_template.uuid + opts['keypair'] = args.keypair_id opts['node_count'] = args.node_count opts['master_count'] = args.master_count opts['discovery_url'] = args.discovery_url