..
 This work is licensed under a Creative Commons Attribution 4.0
 International License.
 Copyright (c) 2017-2018 Wind River Systems, Inc.

===============================
MultiCloud Multi-Region support
===============================

This proposal describes how MultiCloud plugin automates the on-boarding of tens or hundreds of cloud regions by leveraging multi-region feature

Problems Statement
==================

The ONAP functional requirement for Edge Automation aims to automate the VNF orchestration across edge stacks.

..
https://wiki.onap.org/display/DW/Edge+Automation+through+ONAP

Before VNF can be orchestrated over these edge stacks, these edge stacks must be on-boarded into ONAP. This can be a very big challenge in case of tens of or hundred of edge stacks. Fortunately, With OpenStack multi-region feature, the OpenStack primary region will expose
all secondary regions' endpoints. Hence MultiCloud plugins could automate the discovery and registry
of all OpenStack secondary regions.


Proposed Design and Workflow
============================

**This automation assumes**:
 - ONAP could use the same set of credentials (project, user/password) to access all OpenStack regions for orchestration.
 - ONAP user will explicitly enable the automation of discovery OpenStack secondary regions during manually on-boarding the OpenStack primary region.
 - ONAP users could manually manage the cloud regions representing those secondary regions just like a normal cloud region


**With OpenStack primary region, the ONAP user will**:
..
https://wiki.onap.org/pages/viewpage.action?pageId=25431491
 - Manually on-board this primary region with ESR VIM registration portal.
 - Input the {cloud-owner} and {cloud-region-id} as the ID of cloud region which is unique.
 - Specify the location id
 - Specify the intention of automation of OpenStack secondary regions managed by this primary region. This intention is specified with key-value pair {"multi-region-discovery":"true"} populated to cloud region's property "cloud-extra-info"


**With OpenStack primary region, the corresponding MultiCloud plugin will**:
 - Discover all OpenStack secondary regions in case being explicitly indicated with key-value pair {"multi-region-discovery":"true"}
 - Register each of discovered OpenStack regions as a new cloud region into AAI.
 - Duplicate the credentials and location relationship from primary region.
 - Duplicate all or part of the cloud region's property "cloud-extra-info",
 - Add one more key-value pair to cloud region's property "cloud-extra-info": {"primary-region":["{cloud-owner}","{cloud-region-id}"]}
 - Add relationship to the cloud region of primary region: to be checked.
 - Generate the ID of cloud region representing the OpenStack secondary region with following rules:
   - {cloud-owner} should be {cloud-owner of primary region}.
   - {cloud-region-id} will be the concatenated string with format: {cloud-region-id of primary region}.{OpenStack Region ID}.
 - The composite keys {cloud-owner},{cloud-region-id of primary region}.{OpenStack Region ID} will be unique since the composite key of primary region: {cloud-owner},{cloud-region-id} is unique.


**With generated cloud region representing the OpenStack secondary region, the ONAP user could**:
 - update the credentials so that the ONAP could use updated credentials to orchestrate VNF to this cloud region
 - update the location of the cloud region by associating it to different complex object other than the one same to primary region.
 - Update cloud region's property "cloud-extra-info".
 - Decommission or delete the cloud region


Appendix:
=========

There is a property of cloud region object named "cloud-extra-info"
..
https://wiki.onap.org/display/DW/AAI+REST+API+Documentation+-+Beijing

::

   cloud-extra-info: string
     ESR inputs extra information about the VIM or Cloud which will be decoded by MultiVIM.

the intention of this property is to enable the extending of cloud region object without impact AAI's schema. How and when to use this property is up to each multicloud
plugin respectively. This property can be populated by ONAP users through ESR VIM registration GUI Portal (the input field label: "Cloud Extra Info"). The best practice to utilize this "cloud-extra-info" property is that ONAP users to input format json string, with
which extra configuration data can be serialized as {"key":"value"} into this json string. And the corresponding MultiCloud plugin decode and utilize the input key-value pairs.
