diff --git a/fuelclient/cli/actions/__init__.py b/fuelclient/cli/actions/__init__.py index 80e7128..d9f4352 100644 --- a/fuelclient/cli/actions/__init__.py +++ b/fuelclient/cli/actions/__init__.py @@ -32,6 +32,7 @@ from fuelclient.cli.actions.notifications import NotifyAction from fuelclient.cli.actions.release import ReleaseAction from fuelclient.cli.actions.role import RoleAction from fuelclient.cli.actions.settings import SettingsAction +from fuelclient.cli.actions.settings import VmwareSettingsAction from fuelclient.cli.actions.snapshot import SnapshotAction from fuelclient.cli.actions.task import TaskAction from fuelclient.cli.actions.user import UserAction @@ -48,6 +49,7 @@ actions_tuple = ( StopAction, ResetAction, SettingsAction, + VmwareSettingsAction, NetworkAction, TaskAction, SnapshotAction, diff --git a/fuelclient/cli/actions/settings.py b/fuelclient/cli/actions/settings.py index a93b822..142cc71 100644 --- a/fuelclient/cli/actions/settings.py +++ b/fuelclient/cli/actions/settings.py @@ -83,3 +83,53 @@ class SettingsAction(Action): " downloaded to {1}" .format(env.id, settings_file_path) ) + + +class VmwareSettingsAction(SettingsAction): + """Show or modify environment vmware settings + """ + action_name = "vmware-settings" + + def upload(self, params): + """To upload vmware settings for some environment from some directory: + fuel --env 1 vmware-settings --upload --dir path/to/directory + """ + env = Environment(params.env) + vmware_settings_data = env.read_vmware_settings_data( + directory=params.dir, + serializer=self.serializer + ) + env.set_vmware_settings_data(vmware_settings_data) + print("Vmware settings configuration uploaded.") + + def default(self, params): + """To download default vmware settings for some environment + in some directory: + fuel --env 1 vmware-settings --default --dir path/to/directory + """ + env = Environment(params.env) + vmware_default_data = env.get_default_vmware_settings_data() + settings_file_path = env.write_vmware_settings_data( + vmware_default_data, + directory=params.dir, + serializer=self.serializer) + print( + "Default vmware settings configuration downloaded to {0}." + .format(settings_file_path) + ) + + def download(self, params): + """To download vmware settings for some environment in this directory: + fuel --env 1 vmware-settings --download + """ + env = Environment(params.env) + settings_data = env.get_vmware_settings_data() + settings_file_path = env.write_vmware_settings_data( + settings_data, + directory=params.dir, + serializer=self.serializer) + print( + "Vmware settings configuration for environment with id={0}" + " downloaded to {1}" + .format(env.id, settings_file_path) + ) diff --git a/fuelclient/objects/environment.py b/fuelclient/objects/environment.py index dd6c4fe..f9fc2f0 100644 --- a/fuelclient/objects/environment.py +++ b/fuelclient/objects/environment.py @@ -132,6 +132,12 @@ class Environment(BaseObject): "settings_{0}".format(self.id) ) + def get_vmware_settings_data_path(self, directory=os.curdir): + return os.path.join( + os.path.abspath(directory), + "vmware_settings_{0}".format(self.id) + ) + def write_network_data(self, network_data, directory=os.curdir, serializer=None): return (serializer or self.serializer).write_to_file( @@ -146,6 +152,13 @@ class Environment(BaseObject): settings_data ) + def write_vmware_settings_data(self, settings_data, directory=os.curdir, + serializer=None): + return (serializer or self.serializer).write_to_file( + self.get_vmware_settings_data_path(directory), + settings_data + ) + def read_network_data(self, directory=os.curdir, serializer=None): network_file_path = self.get_network_data_path(directory) @@ -157,6 +170,10 @@ class Environment(BaseObject): return (serializer or self.serializer).read_from_file( settings_file_path) + def read_vmware_settings_data(self, directory=os.curdir, serializer=None): + return (serializer or self.serializer).read_from_file( + self.get_vmware_settings_data_path(directory)) + @property def status(self): return self.get_fresh_data()['status'] @@ -169,6 +186,14 @@ class Environment(BaseObject): def default_settings_url(self): return self.settings_url + "/defaults" + @property + def vmware_settings_url(self): + return "clusters/{0}/vmware_attributes".format(self.id) + + @property + def default_vmware_settings_url(self): + return self.vmware_settings_url + "/defaults" + @property def network_url(self): return "clusters/{id}/network_configuration/{net_provider}".format( @@ -188,6 +213,12 @@ class Environment(BaseObject): def get_default_settings_data(self): return self.connection.get_request(self.default_settings_url) + def get_vmware_settings_data(self): + return self.connection.get_request(self.vmware_settings_url) + + def get_default_vmware_settings_data(self): + return self.connection.get_request(self.default_vmware_settings_url) + def set_network_data(self, data): return self.connection.put_request( self.network_url, data) @@ -196,6 +227,10 @@ class Environment(BaseObject): return self.connection.put_request( self.settings_url, data) + def set_vmware_settings_data(self, data): + return self.connection.put_request( + self.vmware_settings_url, data) + def verify_network(self): return self.connection.put_request( self.network_verification_url, self.get_network_data()) diff --git a/fuelclient/tests/test_settings.py b/fuelclient/tests/test_settings.py new file mode 100644 index 0000000..c8a19b4 --- /dev/null +++ b/fuelclient/tests/test_settings.py @@ -0,0 +1,138 @@ +# -*- coding: utf-8 -*- +# +# 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 json + +from mock import Mock +from mock import mock_open +from mock import patch + +from fuelclient.tests import base + + +YAML_SETTINGS_DATA = """editable: + access: + user: + value: test_user +""" +JSON_SETTINGS_DATA = { + 'editable': { + 'access': { + 'user': { + 'value': 'test_user' + } + } + } +} + + +class BaseSettings(base.UnitTestCase): + + def check_upload_action(self, mrequests, test_command, test_url): + m = mock_open(read_data=YAML_SETTINGS_DATA) + with patch('__builtin__.open', m, create=True): + self.execute_wo_auth(test_command) + + request = mrequests.put.call_args_list[0] + url = request[0][0] + data = request[1]['data'] + + m().read.assert_called_once_with() + self.assertEqual(mrequests.put.call_count, 1) + self.assertIn(test_url, url) + self.assertDictEqual(json.loads(data), JSON_SETTINGS_DATA) + + def check_default_action(self, mrequests, test_command, test_url): + m = mock_open() + mresponse = Mock(status_code=200) + mresponse.json.return_value = JSON_SETTINGS_DATA + mrequests.get.return_value = mresponse + + with patch('__builtin__.open', m, create=True): + self.execute_wo_auth(test_command) + + request = mrequests.get.call_args_list[0] + url = request[0][0] + + m().write.assert_called_once_with(YAML_SETTINGS_DATA) + self.assertEqual(mrequests.get.call_count, 1) + self.assertIn(test_url, url) + + def check_download_action(self, mrequests, test_command, test_url): + m = mock_open() + mresponse = Mock(status_code=200) + mresponse.json.return_value = JSON_SETTINGS_DATA + mrequests.get.return_value = mresponse + + with patch('__builtin__.open', m, create=True): + self.execute_wo_auth(test_command) + + request = mrequests.get.call_args_list[0] + url = request[0][0] + + m().write.assert_called_once_with(YAML_SETTINGS_DATA) + self.assertEqual(mrequests.get.call_count, 1) + self.assertIn(test_url, url) + + +@patch('fuelclient.client.requests') +class TestSettings(BaseSettings): + + def test_upload_action(self, mrequests): + self.check_upload_action( + mrequests=mrequests, + test_command=[ + 'fuel', 'settings', '--env', '1', '--upload'], + test_url='/api/v1/clusters/1/attributes') + + def test_default_action(self, mrequests): + self.check_default_action( + mrequests=mrequests, + test_command=[ + 'fuel', 'settings', '--env', '1', '--default'], + test_url='/api/v1/clusters/1/attributes/default') + + def test_download_action(self, mrequests): + self.check_download_action( + mrequests=mrequests, + test_command=[ + 'fuel', 'settings', '--env', '1', '--download'], + test_url='/api/v1/clusters/1/attributes') + + +@patch('fuelclient.client.requests') +class TestVmwareSettings(BaseSettings): + + def test_upload_action(self, mrequests): + self.check_upload_action( + mrequests=mrequests, + test_command=[ + 'fuel', 'vmware-settings', '--env', '1', '--upload'], + test_url='/api/v1/clusters/1/vmware_attributes') + + def test_default_action(self, mrequests): + self.check_default_action( + mrequests=mrequests, + test_command=[ + 'fuel', 'vmware-settings', '--env', '1', '--default'], + test_url='/api/v1/clusters/1/vmware_attributes/default') + + def test_download_action(self, mrequests): + self.check_download_action( + mrequests=mrequests, + test_command=[ + 'fuel', 'vmware-settings', '--env', '1', '--download'], + test_url='/api/v1/clusters/1/vmware_attributes')