diff --git a/magnum/base.py b/magnum/base.py new file mode 100644 index 0000000000..34889d544c --- /dev/null +++ b/magnum/base.py @@ -0,0 +1,113 @@ +# 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 abc + +import six + + +@six.add_metaclass(abc.ABCMeta) +class BayBase(object): + pass + + +@six.add_metaclass(abc.ABCMeta) +class BayFactory(BayBase): + @abc.abstractmethod + def list(self): + pass + + @abc.abstractmethod + def create(self, pod_definition=None): + pass + + @abc.abstractmethod + def get_pod(self, pod_id): + pass + + +@six.add_metaclass(abc.ABCMeta) +class Bay(BayBase): + @abc.abstractmethod + def destroy(self): + pass + + @abc.abstractmethod + def stop(self): + pass + + +@six.add_metaclass(abc.ABCMeta) +class ContainerBase(object): + pass + + +@six.add_metaclass(abc.ABCMeta) +class PodFactory(ContainerBase): + @abc.abstractmethod + def list(self, bay_id): + pass + + @abc.abstractmethod + def create(self, bay_id, pod_definition): + pass + + +@six.add_metaclass(abc.ABCMeta) +class Pod(ContainerBase): + pass + + +@six.add_metaclass(abc.ABCMeta) +class ContainerFactory(ContainerBase): + @abc.abstractmethod + def create(self, *args, **kwargs): + pass + + @abc.abstractmethod + def list(self): + pass + + +@six.add_metaclass(abc.ABCMeta) +class Container(ContainerBase): + @abc.abstractmethod + def info(self): + pass + + @abc.abstractmethod + def reboot(self): + pass + + @abc.abstractmethod + def kill(self): + pass + + @abc.abstractmethod + def destroy(self): + pass + + @abc.abstractmethod + def logs(self): + pass + + @abc.abstractmethod + def pause(self): + pass + + @abc.abstractmethod + def unpause(self): + pass + + @abc.abstractmethod + def execute(self, cmd): + pass \ No newline at end of file diff --git a/magnum/cloud/__init__.py b/magnum/cloud/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/magnum/cloud/nova_driver.py b/magnum/cloud/nova_driver.py new file mode 100644 index 0000000000..25814f365e --- /dev/null +++ b/magnum/cloud/nova_driver.py @@ -0,0 +1,45 @@ +# 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 magnum import base + + +KEYSTONE_URL = "https://example.com:5000/v2.0/" + + +class NovaBayBase(base.BayBase): + pass + + +class NovaBayFactory(NovaBayBase): + def __init__(self): + pass + + def list(self): + self.nova.servers.list() + + def create(self, pod_definition=None): + pass + + def get_pod(self, pod_id): + return NovaBay(pod_id) + + +class NovaBay(NovaBayBase): + def __init__(self, pod_id): + self.pod_id = pod_id + + def destroy(self): + pass + + def stop(self): + pass diff --git a/magnum/container/__init__.py b/magnum/container/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/magnum/container/docker_driver.py b/magnum/container/docker_driver.py new file mode 100644 index 0000000000..a62ad89122 --- /dev/null +++ b/magnum/container/docker_driver.py @@ -0,0 +1,57 @@ +# 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 docker + +from magnum import base + + +class DockerContainerFactory(base.ContainerFactory): + def __init__(self, pod_id, client=None): + self.docker = client or docker.Client() + + def create(self, *args, **kwargs): + self.docker.create_container(**kwargs) + self.docker.start(self.container_id) + + def list(self): + return self.docker.containers() + + +class DockerContainer(base.Container): + def __init__(self, client, container_id): + self.docker = client + self.container_id = container_id + + def info(self): + self.docker.inspect(self.container_id) + + def reboot(self): + self.docker.reboot(self.container_id) + + def kill(self): + self.docker.kill(self.container_id) + + def destroy(self): + self.docker.destroy(self.container_id) + + def logs(self): + return self.docker.logs(self.container_id) + + def pause(self): + self.docker.pause(self.container_id) + + def unpause(self): + self.docker.unpause(self.container_id) + + def execute(self, cmd): + return self.docker.execute(self.container_id, cmd) diff --git a/requirements.txt b/requirements.txt index 62bbdd12e9..01c9e05914 100644 --- a/requirements.txt +++ b/requirements.txt @@ -14,3 +14,4 @@ python-keystoneclient>=0.11.1 python-zaqarclient>=0.0.3 six>=1.7.0 WSME>=0.6 +docker-py>=0.5.1