..
 This work is licensed under a Creative Commons Attribution 3.0 Unported
 License.

 http://creativecommons.org/licenses/by/3.0/legalcode

=============================================================================
The kubernetes pod with persistent volumes protectable and protection plugins
=============================================================================

https://blueprints.launchpad.net/karbor/+spec/kubernetes-pods-protection-plugin

Problem description
===================

With the rapid development of cloud computing, there is a trend of explosive growth in cloud
data over recent years. Cloud data backup and recovery has become an urgent topic which the
customers concern. Running Kubernetes on OpenStack becames more and more popular. The data
protection of the application on Kubernetes also need be considered.

In this spec we would like to introduce a plugin in Karbor to protect your application deployed
in Kubernetes which runs on top of OpenStack. The application data protected by Karbor include
the configurations and metadata in etcd service, and the persistent volume provided by Cinder.


Use Cases
=========

The kubernetes cluster can run on openstack instances using Openstack cloud provider, the pods
can be created with persistent volumes provided by Cinder. This bp adds kubernetes pods with
persistent volumes protection plugin in Karbor.

Proposed change
===============

The kubernetes pod protectable plugin:
--------------------------------------
A new protectable plugin about The kubernetes pod need be implemented.
The type of resource the kubernetes pod is "OS::Kubernetes::Pod". It will be added to the constant
RESOURCE_TYPES in Karbor.


1. The parent resource types: PROJECT_RESOURCE_TYPE

2. list the resources:

   This interface of plugin will call the 'list_pod_for_all_namespaces' API method in the
   kubernetes python client[1].

3. show the resource:

   This interface of plugin will call the 'read_namespaced_pod' method API method in the
   kubernetes python client. The parameter is a pod id.

4. get dependent resources:

   The parameter parent_resource is a project, this interface of plugin will return the
   kubernetes pod in this project.

The volume protectable plugin:
------------------------------
1. Add a new parent resource types: "OS::Kubernetes::Pod"

2. get dependent resources:

   The parameter parent_resource is a kubernetes pod, this interface of plugin will return the
   persistent volumes list provided by Cinder in the this parent resource pod.


The kubernetes pod protection plugin
------------------------------------
A new protection plugin about the kubernetes pod need be implemented.

1. Protect Operation:
   The configurations and metadata in etcd service about the pod will be saved to
   the bank of Karbor.

2. Restore Operation:
   The persistent volumes of the pod will be restored by Cinder Volume plugins.

   Get the the configurations and metadata in etcd service about the pod from bank, and create
   a new pod with restored persistent volumes from cinder in the kubernetes cluster.

3. Delete Operation:

   The configurations and metadata about the pod will be deleted from the bank.
   The backup data of persistent volumes will be deleted from Cinder.

The kubernetes pod protection plugin schema:
--------------------------------------------

::

    OPTIONS_SCHEMA = {
        "title": "The kubernetes pod Protection Options",
        "type": "object",
        "properties": {
            "backup_name": {
                "type": "string",
                "title": "Backup Name",
                "description": "The name of the kubernetes pod backup."
            },
            "description": {
                "type": "string",
                "title": "Description",
                "description": "The description of the kubernetes pod backup."
            }
        },
        "required": ["backup_name", "description"]
    }

    RESTORE_SCHEMA = {
        "title": "The kubernetes pod Protection Restore",
        "type": "object",
        "properties": {
            "restore_name": {
                "type": "string",
                "title": "Restore Name",
                "description": "The name of the restored kubernetes pod.",
                "default": None
            },
            "restore_description": {
                "type": "string",
                "title": "Restore Description",
                "description": "The description of the restored kubernetes pod.",
                "default": None
            }
        }
    }


Alternatives
------------

None

Data model impact
-----------------

None

REST API impact
---------------

None

Security impact
---------------

None

Notifications impact
--------------------

None

Other end user impact
---------------------

None

Performance Impact
------------------

None

Other deployer impact
---------------------

Add the kubernetes pod protection plugin endpoint to setup.cfg.
Add the kubernetes pod protection plugin configuration to provider file.


Developer impact
----------------

None


Implementation
==============

Assignee(s)
-----------


Work Items
----------

* Write kubernetes pod backup protectable plugin
* Write kubernetes pod backup protection plugin
* Write tests
* Add a usage example about kubernetes pod protection

Dependencies
============

None


Testing
=======

Unit tests in Karbor.


Documentation Impact
====================

Add a usage example about kubernetes pod protection.


References
==========

[1] https://github.com/kubernetes-incubator/client-python
