diff --git a/doc/source/users/proxies/compute.rst b/doc/source/users/proxies/compute.rst index 5a5f25364..a19d2842b 100644 --- a/doc/source/users/proxies/compute.rst +++ b/doc/source/users/proxies/compute.rst @@ -29,6 +29,7 @@ Server Operations .. automethod:: openstack.compute.v2._proxy.Proxy.delete_server_metadata .. automethod:: openstack.compute.v2._proxy.Proxy.wait_for_server .. automethod:: openstack.compute.v2._proxy.Proxy.create_server_image + .. automethod:: openstack.compute.v2._proxy.Proxy.backup_server Network Actions *************** diff --git a/openstack/compute/v2/_proxy.py b/openstack/compute/v2/_proxy.py index 6d342d91a..fa826ccef 100644 --- a/openstack/compute/v2/_proxy.py +++ b/openstack/compute/v2/_proxy.py @@ -620,6 +620,22 @@ class Proxy(proxy2.BaseProxy): server = self._get_resource(_server.Server, server) server.remove_floating_ip(self._session, address) + def backup_server(self, server, name, backup_type, rotation): + """Backup a server + + :param server: Either the ID of a server or a + :class:`~openstack.compute.v2.server.Server` instance. + :param name: The name of the backup image. + :param backup_type: The type of the backup, for example, daily. + :param rotation: The rotation of the back up image, the oldest + image will be removed when image count exceed + the rotation count. + + :returns: None + """ + server = self._get_resource(_server.Server, server) + server.backup(self._session, name, backup_type, rotation) + def pause_server(self, server): """Pauses a server and changes its status to ``PAUSED``. diff --git a/openstack/compute/v2/server.py b/openstack/compute/v2/server.py index 75c89a364..b45277ca1 100644 --- a/openstack/compute/v2/server.py +++ b/openstack/compute/v2/server.py @@ -274,6 +274,16 @@ class Server(resource2.Resource, metadata.MetadataMixin): body = {"removeFloatingIp": {"address": address}} self._action(session, body) + def backup(self, session, name, backup_type, rotation): + body = { + "createBackup": { + "name": name, + "backup_type": backup_type, + "rotation": rotation + } + } + self._action(session, body) + def pause(self, session): body = {"pause": None} self._action(session, body) diff --git a/openstack/tests/unit/compute/v2/test_proxy.py b/openstack/tests/unit/compute/v2/test_proxy.py index f50112fcf..0e9ec135e 100644 --- a/openstack/tests/unit/compute/v2/test_proxy.py +++ b/openstack/tests/unit/compute/v2/test_proxy.py @@ -318,6 +318,12 @@ class TestComputeProxy(test_proxy_base2.TestProxyBase): method_args=["value", "address"], expected_args=["address"]) + def test_server_backup(self): + self._verify("openstack.compute.v2.server.Server.backup", + self.proxy.backup_server, + method_args=["value", "name", "daily", 1], + expected_args=["name", "daily", 1]) + def test_server_pause(self): self._verify("openstack.compute.v2.server.Server.pause", self.proxy.pause_server, diff --git a/openstack/tests/unit/compute/v2/test_server.py b/openstack/tests/unit/compute/v2/test_server.py index 0c5109e36..481683041 100644 --- a/openstack/tests/unit/compute/v2/test_server.py +++ b/openstack/tests/unit/compute/v2/test_server.py @@ -424,6 +424,19 @@ class TestServer(testtools.TestCase): self.sess.post.assert_called_with( url, endpoint_filter=sot.service, json=body, headers=headers) + def test_backup(self): + sot = server.Server(**EXAMPLE) + + res = sot.backup(self.sess, "name", "daily", 1) + + self.assertIsNone(res) + url = 'servers/IDENTIFIER/action' + body = {"createBackup": {"name": "name", "backup_type": "daily", + "rotation": 1}} + headers = {'Accept': ''} + self.sess.post.assert_called_with( + url, endpoint_filter=sot.service, json=body, headers=headers) + def test_pause(self): sot = server.Server(**EXAMPLE)