Merge "Add network templates support for v2"
This commit is contained in:
98
fuelclient/commands/network_template.py
Normal file
98
fuelclient/commands/network_template.py
Normal file
@@ -0,0 +1,98 @@
|
||||
# Copyright 2015 Mirantis, Inc.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
from fuelclient.commands import base
|
||||
|
||||
|
||||
class NetworkTemplateMixin(object):
|
||||
|
||||
entity_name = 'environment'
|
||||
|
||||
@staticmethod
|
||||
def add_env_argument(parser):
|
||||
parser.add_argument(
|
||||
'env',
|
||||
type=int,
|
||||
help='Upload network template for specified environment'
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def add_dir_argument(parser):
|
||||
parser.add_argument(
|
||||
'-d', '--dir',
|
||||
type=str,
|
||||
help='Directory with network data'
|
||||
)
|
||||
|
||||
|
||||
class NetworkTemplateUpload(NetworkTemplateMixin, base.BaseCommand):
|
||||
"""To upload network configuration for specified environment:
|
||||
|
||||
fuel2 network-template upload --dir path/to/directory 1
|
||||
"""
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(NetworkTemplateUpload, self).get_parser(prog_name)
|
||||
|
||||
self.add_dir_argument(parser)
|
||||
self.add_env_argument(parser)
|
||||
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
file_path = self.client.upload_network_template(
|
||||
parsed_args.env, parsed_args.dir)
|
||||
msg = "Network template {0} has been uploaded.".format(file_path)
|
||||
self.app.stdout.write(msg)
|
||||
|
||||
|
||||
class NetworkTemplateDownload(NetworkTemplateMixin, base.BaseCommand):
|
||||
"""To download network configuration for environment to the specified
|
||||
directory:
|
||||
fuel2 network-template download --dir path/to/directory 1
|
||||
"""
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(NetworkTemplateDownload, self).get_parser(prog_name)
|
||||
|
||||
self.add_dir_argument(parser)
|
||||
self.add_env_argument(parser)
|
||||
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
file_path = self.client.download_network_template(
|
||||
parsed_args.env, parsed_args.dir)
|
||||
|
||||
msg = ("Network template configuration for environment with id={0}"
|
||||
" downloaded to {1}\n").format(
|
||||
parsed_args.env, file_path)
|
||||
self.app.stdout.write(msg)
|
||||
|
||||
|
||||
class NetworkTemplateDelete(NetworkTemplateMixin, base.BaseCommand):
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(NetworkTemplateDelete, self).get_parser(prog_name)
|
||||
|
||||
self.add_env_argument(parser)
|
||||
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
self.client.delete_network_template(parsed_args.env)
|
||||
|
||||
msg = ("Network template for environment id={0}"
|
||||
" has been deleted.".format(parsed_args.env))
|
||||
self.app.stdout.write(msg)
|
||||
@@ -147,7 +147,8 @@ class Environment(BaseObject):
|
||||
"vmware_settings_{0}".format(self.id)
|
||||
)
|
||||
|
||||
def get_network_template_data_path(self, directory=os.curdir):
|
||||
def get_network_template_data_path(self, directory=None):
|
||||
directory = directory or os.curdir
|
||||
return os.path.join(
|
||||
os.path.abspath(directory),
|
||||
"network_template_{0}".format(self.id)
|
||||
@@ -167,15 +168,17 @@ class Environment(BaseObject):
|
||||
settings_data
|
||||
)
|
||||
|
||||
def write_vmware_settings_data(self, settings_data, directory=os.curdir,
|
||||
def write_vmware_settings_data(self, settings_data, directory=None,
|
||||
serializer=None):
|
||||
directory = directory or os.curdir
|
||||
return (serializer or self.serializer).write_to_path(
|
||||
self.get_vmware_settings_data_path(directory),
|
||||
settings_data
|
||||
)
|
||||
|
||||
def write_network_template_data(self, template_data, directory=os.curdir,
|
||||
def write_network_template_data(self, template_data, directory=None,
|
||||
serializer=None):
|
||||
directory = directory or os.curdir
|
||||
return (serializer or self.serializer).write_to_path(
|
||||
self.get_network_template_data_path(directory),
|
||||
template_data
|
||||
@@ -275,6 +278,9 @@ class Environment(BaseObject):
|
||||
return self.connection.put_request(
|
||||
self.network_template_url, data)
|
||||
|
||||
def delete_network_template_data(self):
|
||||
return self.connection.delete_request(self.network_template_url)
|
||||
|
||||
def _get_fact_dir_name(self, fact_type, directory=os.path.curdir):
|
||||
return os.path.join(
|
||||
os.path.abspath(directory),
|
||||
|
||||
65
fuelclient/tests/v2/unit/cli/test_network_template.py
Normal file
65
fuelclient/tests/v2/unit/cli/test_network_template.py
Normal file
@@ -0,0 +1,65 @@
|
||||
#
|
||||
# Copyright 2015 Mirantis, Inc.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
import mock
|
||||
|
||||
from fuelclient.tests.v2.unit.cli import test_engine
|
||||
|
||||
|
||||
class TestNetworkTemplateCommand(test_engine.BaseCLITest):
|
||||
|
||||
def test_network_template_upload(self):
|
||||
args = 'network-template upload 1'
|
||||
self.exec_command(args)
|
||||
|
||||
self.m_get_client.assert_called_once_with('environment', mock.ANY)
|
||||
self.m_client.upload_network_template.assert_called_once_with(
|
||||
1, None)
|
||||
|
||||
def test_network_template_upload_w_dir(self):
|
||||
args = 'network-template upload --dir /tmp/test-dir 1'
|
||||
self.exec_command(args)
|
||||
|
||||
self.m_get_client.assert_called_once_with('environment', mock.ANY)
|
||||
self.m_client.upload_network_template.assert_called_once_with(
|
||||
1, '/tmp/test-dir')
|
||||
|
||||
def test_network_template_download(self):
|
||||
download_mock = self.m_client.download_network_template
|
||||
download_mock.return_value = '/tmp/test-dir/settings_1'
|
||||
|
||||
args = 'network-template download 1'
|
||||
self.exec_command(args)
|
||||
|
||||
self.m_get_client.assert_called_once_with('environment', mock.ANY)
|
||||
download_mock.assert_called_once_with(1, None)
|
||||
|
||||
def test_network_template_download_w_dir(self):
|
||||
download_mock = self.m_client.download_network_template
|
||||
download_mock.return_value = '/tmp/test-dir/settings_1'
|
||||
|
||||
args = 'network-template download --dir /tmp/test-dir 1'
|
||||
self.exec_command(args)
|
||||
|
||||
self.m_get_client.assert_called_once_with('environment', mock.ANY)
|
||||
download_mock.assert_called_once_with(1, '/tmp/test-dir')
|
||||
|
||||
def test_network_template_delete(self):
|
||||
args = 'network-template delete 1'
|
||||
self.exec_command(args)
|
||||
|
||||
self.m_get_client.assert_called_once_with('environment', mock.ANY)
|
||||
delete_mock = self.m_client.delete_network_template
|
||||
delete_mock.assert_called_once_with(1)
|
||||
74
fuelclient/tests/v2/unit/lib/test_network_template.py
Normal file
74
fuelclient/tests/v2/unit/lib/test_network_template.py
Normal file
@@ -0,0 +1,74 @@
|
||||
#
|
||||
# Copyright 2015 Mirantis, Inc.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
import mock
|
||||
import yaml
|
||||
|
||||
from oslo_serialization import jsonutils as json
|
||||
|
||||
import fuelclient
|
||||
from fuelclient.tests.common.unit import \
|
||||
test_network_template as common_net_template
|
||||
from fuelclient.tests.v2.unit.lib import test_api
|
||||
|
||||
|
||||
class TestNetworkTemplateFacade(test_api.BaseLibTest):
|
||||
|
||||
def setUp(self):
|
||||
super(TestNetworkTemplateFacade, self).setUp()
|
||||
|
||||
self.version = 'v1'
|
||||
self.env_id = 42
|
||||
self.res_uri = (
|
||||
'/api/{version}/clusters/{env_id}'
|
||||
'/network_configuration/template'.format(
|
||||
version=self.version, env_id=self.env_id))
|
||||
|
||||
self.client = fuelclient.get_client('environment', self.version)
|
||||
|
||||
def test_network_template_upload(self):
|
||||
expected_body = json.loads(common_net_template.JSON_TEMPLATE)
|
||||
matcher = self.m_request.put(
|
||||
self.res_uri, json=expected_body)
|
||||
|
||||
m_open = mock.mock_open(read_data=common_net_template.YAML_TEMPLATE)
|
||||
with mock.patch('fuelclient.cli.serializers.open',
|
||||
m_open, create=True):
|
||||
self.client.upload_network_template(self.env_id)
|
||||
|
||||
self.assertTrue(matcher.called)
|
||||
self.assertEqual(expected_body, matcher.last_request.json())
|
||||
|
||||
def test_network_template_download(self):
|
||||
expected_body = json.loads(common_net_template.JSON_TEMPLATE)
|
||||
matcher = self.m_request.get(self.res_uri, json=expected_body)
|
||||
|
||||
m_open = mock.mock_open()
|
||||
with mock.patch('fuelclient.cli.serializers.open',
|
||||
m_open, create=True):
|
||||
self.client.download_network_template(self.env_id)
|
||||
|
||||
self.assertTrue(matcher.called)
|
||||
|
||||
written_yaml = yaml.safe_load(m_open().write.mock_calls[0][1][0])
|
||||
expected_yaml = yaml.safe_load(common_net_template.YAML_TEMPLATE)
|
||||
self.assertEqual(written_yaml, expected_yaml)
|
||||
|
||||
def test_network_template_delete(self):
|
||||
matcher = self.m_request.delete(self.res_uri, json={})
|
||||
|
||||
self.client.delete_network_template(self.env_id)
|
||||
|
||||
self.assertTrue(matcher.called)
|
||||
@@ -92,6 +92,29 @@ class EnvironmentClient(base_v1.BaseV1Client):
|
||||
env = self._entity_wrapper(obj_id=environment_id)
|
||||
return env.spawn_vms()
|
||||
|
||||
def upload_network_template(self, environment_id, directory=None):
|
||||
env = self._entity_wrapper(environment_id)
|
||||
network_template_data = env.read_network_template_data(
|
||||
directory=directory)
|
||||
env.set_network_template_data(network_template_data)
|
||||
|
||||
file_path = env.serializer.prepare_path(
|
||||
env.get_network_template_data_path(directory=directory))
|
||||
return file_path
|
||||
|
||||
def download_network_template(self, environment_id, directory=None):
|
||||
env = self._entity_wrapper(environment_id)
|
||||
template_data = env.get_network_template_data()
|
||||
file_path = env.write_network_template_data(
|
||||
template_data,
|
||||
directory=directory)
|
||||
|
||||
return file_path
|
||||
|
||||
def delete_network_template(self, environment_id):
|
||||
env = self._entity_wrapper(environment_id)
|
||||
env.delete_network_template_data()
|
||||
|
||||
|
||||
def get_client():
|
||||
return EnvironmentClient()
|
||||
|
||||
@@ -48,6 +48,9 @@ fuelclient =
|
||||
task_list=fuelclient.commands.task:TaskList
|
||||
task_show=fuelclient.commands.task:TaskShow
|
||||
fuel-version=fuelclient.commands.fuelversion:FuelVersion
|
||||
network-template_upload=fuelclient.commands.network_template:NetworkTemplateUpload
|
||||
network-template_download=fuelclient.commands.network_template:NetworkTemplateDownload
|
||||
network-template_delete=fuelclient.commands.network_template:NetworkTemplateDelete
|
||||
|
||||
[global]
|
||||
setup-hooks =
|
||||
|
||||
Reference in New Issue
Block a user