Merge "Add a k8s cloud site to ONAP"
authorEric Debeau <eric.debeau@orange.com>
Tue, 7 Jan 2020 09:00:34 +0000 (09:00 +0000)
committerGerrit Code Review <gerrit@onap.org>
Tue, 7 Jan 2020 09:00:34 +0000 (09:00 +0000)
28 files changed:
docs/guides/onap-operator/cloud_site/openstack/index.rst
docs/submodules/aaf/authz.git
docs/submodules/appc.git
docs/submodules/appc/deployment.git
docs/submodules/ccsdk/cds.git
docs/submodules/ccsdk/distribution.git
docs/submodules/ccsdk/features.git
docs/submodules/dmaap/buscontroller.git
docs/submodules/externalapi/nbi.git
docs/submodules/integration.git
docs/submodules/modeling/etsicatalog.git
docs/submodules/multicloud/k8s.git
docs/submodules/music.git
docs/submodules/oom.git
docs/submodules/policy/engine.git
docs/submodules/portal.git
docs/submodules/sdc.git
docs/submodules/sdnc/oam.git
docs/submodules/so.git
docs/submodules/usecase-ui.git
docs/submodules/vfc/nfvo/driver/vnfm/svnfm.git
docs/submodules/vfc/nfvo/lcm.git
docs/submodules/vid.git
docs/submodules/vnfrqts/guidelines.git
docs/submodules/vnfrqts/requirements.git
docs/submodules/vnfrqts/testcases.git
docs/submodules/vnfrqts/usecases.git
docs/submodules/vvp/documentation.git

index 8688ff3..a7f713f 100644 (file)
@@ -6,19 +6,20 @@
 Adding a new Openstack Cloud Site to ONAP
 =========================================
 
-The following guide describe how to configure ONAP to be able to instantiate
+The following guide describes how to configure ONAP to be able to instantiate
 a service in a new cloud site based on Openstack.
 
 There are 2 methods for ONAP to communicate with Openstack in order
 to instantiate a service:
 
-method 1 : ONAP SO => Openstack
-method 2 : ONAP SO => ONAP MultiCloud => Openstack
+method 1 : ONAP SO => Openstack
+method 2 : ONAP SO => ONAP MultiCloud => Openstack
 
-In this guideline the following parameter/value will be used
+In this guideline the following parameters/values will be used
 
 * Complex Name: My_Complex
-* Region Name: INTEGRATION_CENTER
+* Region Name: ONAP_Cloud_Region_Name
+* Openstack Tenant Region Value: TenantRegion
 * Cloud Owner: MyCompanyName
 
 
@@ -32,20 +33,32 @@ TO BE DESCRIBED
 Method 2 : using ONAP MultiCloud
 --------------------------------
 
-
 STEP 1 : declare Cloud Site in ONAP SO to interact with ONAP multiCloud
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 The MariaDB database of ONAP SO needs to be modified.
 
-In the ONAP SO, the use of ONAP Multicloud for that Cloud Site need
-to be indicated.
+In the ONAP SO, the use of ONAP Multicloud for that Cloud Site needs to be
+indicated.
+
+ONAP SO will communicate with ONAP MultiCloud that interfaces target cloud
+environment. Two configuration options are offered:
+
+* First option: Declare multicloud URL in identity_services table
 
-ONAP SO will communicate with ONAP MultiCloud like if MultiCloud would be
-an Openstack system.
+  * Openstack tenant credentials are still managed by SO
+  * Openstack tenant region value is checked against Region_ID value in
+    cloud_sites
 
+* Second option (from Dublin version): Target solution managing all Openstack
+  tenant information within AAI
+
+  * ORCHESTRATOR value is set to `multicloud` in cloud_sites table
+  * All Openstack tenant information are stored in AAI and managed by
+    multicloud
 
 Connect to ONAP SO pod
+^^^^^^^^^^^^^^^^^^^^^^
 
 In a Unix Terminal, to get the SO pods id that is providing
 the MariaDB database:
@@ -72,17 +85,31 @@ Nevertheless, you need to provide a correct encrypted value for the pass value.
 "MyCompanyName" is a cloud owner value. WARNING : do not use underscore
 in the value.
 
-"INTEGRATION_CENTER" is the region name
+"ONAP_Cloud_Region_Name" is the ONAP region name that can be different from
+final Openstack tenant region name (TenantRegion in the example).
 
 ::
 
   mysql --user=so_admin --password=so_Admin123
   USE catalogdb
-  INSERT INTO identity_services VALUES('MC_KEYSTONE', 'http://msb-iag.onap:80/api/multicloud/v1/MyCompanyName_INTEGRATION_CENTER/identity/v2.0', 'admin', '5b6f369745f5f0e1c61da7f0656f3daf93c8030a2ea94b7964c67abdcfb49bdf2fa2266344b4caaca1eba8264d277831', 'service', 'admin', 1, 'KEYSTONE', 'USERNAME_PASSWORD', 'lastUser', '2019-07-05 10:32:00', '2019-07-05 10:32:00');
-  INSERT INTO cloud_sites VALUES('INTEGRATION_CENTER', 'INTEGRATION_CENTER', 'MC_KEYSTONE', 2.5, 'INTEGRATION_CENTER', NULL, NULL, NULL, 'MySelf', '2019-07-05 10:32:00', '2019-07-05 10:32:00');
 
+  # First option: Without using ORCHESTRATOR VALUE set to multicloud
+  INSERT INTO identity_services VALUES('MC_KEYSTONE', 'http://msb-iag.onap:80/api/multicloud/v1/MyCompanyName/ONAP_Cloud_Region_Name/identity/v2.0', 'admin', '5b6f369745f5f0e1c61da7f0656f3daf93c8030a2ea94b7964c67abdcfb49bdf2fa2266344b4caaca1eba8264d277831', 'service', 'admin', 1, 'KEYSTONE', 'USERNAME_PASSWORD', 'lastUser', '2019-07-05 10:32:00', '2019-07-05 10:32:00');
+  INSERT INTO cloud_sites VALUES('ONAP_Cloud_Region_Name', 'TenantRegion', 'MC_KEYSTONE', 2.5, 'ONAP_Cloud_Region_Name', NULL, NULL, NULL, 'MySelf', '2019-07-05 10:32:00', '2019-07-05 10:32:00');
+
+  # Second option: using ORCHESTRATOR VALUE set to multicloud from Dublin version
+  INSERT INTO cloud_sites(ID, REGION_ID, IDENTITY_SERVICE_ID, CLOUD_VERSION, CLLI, ORCHESTRATOR) values("ONAP_Cloud_Region_Name", "ONAP_Cloud_Region_Name", "DEFAULT_KEYSTONE", "2.5", "My_Complex", "multicloud");
 
-You need then to change the ONAP SO VNF Adapter Rest API endpoint version:
+
+**Known restriction with second option**
+
+See the following tickets:
+
+* `MULTICLOUD-846 <https://jira.onap.org/browse/MULTICLOUD-846>`_
+* `MULTICLOUD-866 <https://jira.onap.org/browse/MULTICLOUD-866>`_
+
+ONAP SO VNF Adapter Rest API endpoint version shall be set to version "v2"
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 in a unix terminal:
 
@@ -113,26 +140,26 @@ in the section "vnf", modify the rest endpoint:
                endpoint: http://so-openstack-adapter.onapg:8087/services/rest/v1/volume-groups
 
 
-Having modified the configmap, it is necessary to delete the pod in order
-it takes the modification into account.
+Having modified the configmap, it is necessary to delete the pod bpmn-infra in
+order it takes the modification into account.
 
 to find the right pod name:
 
 ::
 
-  kubectl -n onap get po | grep so-so
+  kubectl get po -n onap |grep bpmn-infra
 
 
 You need to find the pod that is similar to the following pod id:
 
-"onap-so-so-6b9f64b887-jgrdp"
+"onap-so-so-bpmn-infra-79fdf6f9d5-t8qr4"
 
 
 to delete the pod:
 
 ::
 
-  kubectl -n onap delete onap-so-so-6b9f64b887-jgrdp
+  kubectl -n onap delete onap-so-so-bpmn-infra-79fdf6f9d5-t8qr4
 
 
 Then, wait for the pod to restart. To check:
@@ -149,6 +176,7 @@ STEP 2 : declare the new cloud Site in ONAP AAI
 
 
 declare a Complex in ONAP AAI
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 
 A Cloud Site is located in a Building called "Complex" object
@@ -207,42 +235,43 @@ Check the Complexes in ONAP AAI:
 
 
 
-declare a Cloud Site in ONAP AAI
+Declare a Cloud Site in ONAP AAI
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 
 To declare a Cloud Site, you need to use the AAI REST API.
 
-The new Cloud site is named "INTEGRATION_CENTER" in this example.
+The new Cloud site is named "ONAP_Cloud_Region_Name" in this example.
 
 There is also a "Cloud Owner" notion in ONAP AAI datamodel.
 
 The new Cloud Owner is named "MyCompanyName" in this example.
 
 In Openstack, there is also a "region" notion. You need to get the value of
-the region that has been set when deploying your openstack platform
+the region that has been set when deploying your Openstack platform.
 
-In the following example the openstack region has the value "RegionOne"
+In the following example the Openstack region has the value "TenantRegion"
 (in the parameter "cloud-extra-info")
 
 parameter "complex-name" relate to the Complex you previously declared.
 
 parameter "cloud-type" take the value "openstack"
 
-parameter "cloud-region-version" is refering to your openstack version
+parameter "cloud-region-version" is refering to your Openstack version
 
 parameter "cloud-extra-info" will contain the Openstack "region".
-Here, the region ID of the deployed openstack cloud site will be set.
+Here, the region ID of the deployed Openstack cloud site will be set.
 
-In the following example the openstack region has the value "RegionOne".
+In the following example the Openstack region has the value "TenantRegion".
 
-parameter "esr-system-info-list" will contain the list of openstack platform
+parameter "esr-system-info-list" will contain the list of Openstack platform
 credentials that will allow ONAP MultiCloud to communicate with the Cloud Site.
 
 
 ::
 
   curl -X PUT \
-  https://aai.api.sparky.simpledemo.onap.org:30233/aai/v16/cloud-infrastructure/cloud-regions/cloud-region/MyCompanyName/INTEGRATION_CENTER \
+  https://aai.api.sparky.simpledemo.onap.org:30233/aai/v16/cloud-infrastructure/cloud-regions/cloud-region/MyCompanyName/ONAP_Cloud_Region_Name \
   -H 'Accept: application/json' \
   -H 'Authorization: Basic QUFJOkFBSQ==' \
   -H 'Cache-Control: no-cache' \
@@ -253,7 +282,7 @@ credentials that will allow ONAP MultiCloud to communicate with the Cloud Site.
   -H 'X-TransactionId: 9999' \
   -d '{
       "cloud-owner": "MyCompanyName",
-      "cloud-region-id": "INTEGRATION_CENTER",
+      "cloud-region-id": "ONAP_Cloud_Region_Name",
       "cloud-type": "openstack",
       "owner-defined-type": "N/A",
       "cloud-region-version": "pike",
@@ -261,7 +290,7 @@ credentials that will allow ONAP MultiCloud to communicate with the Cloud Site.
       "cloud-zone": "CloudZone",
       "sriov-automation": false,
       "identity-url": "WillBeUpdatedByMultiCloud",
-      "cloud-extra-info":"{\"openstack-region-id\":\"RegionOne\"}"
+      "cloud-extra-info":"{\"openstack-region-id\":\"TenantRegion\"}"
       "esr-system-info-list": {
           "esr-system-info": [
               {
@@ -270,7 +299,7 @@ credentials that will allow ONAP MultiCloud to communicate with the Cloud Site.
               "user-name": "<your openstack user>",
               "password": "<your openstack password>",
               "system-type": "VIM",
-              "ssl-insecure": true,
+              "ssl-insecure": false,
               "cloud-domain": "Default",
               "default-tenant": "<your openstack project name>",
               "system-status": "active"
@@ -279,14 +308,23 @@ credentials that will allow ONAP MultiCloud to communicate with the Cloud Site.
         }
       }' -k
 
+In this example, the cloud-region-version is set to `pike` that is the
+Openstack pike version.
 
-Associate Cloud site to a Complex in ONAP AAI:
+* Multicloud pike plugin is claimed to support Openstack pike
+* It is possible but not guaranteed to support other Openstack version
+  (e.g. rocky) since no testing has been done by multicloud project on all
+  other Openstack versions.
+* Whatever the Openstack version is tested against, if the cause of a bug roots
+  in Openstack pike source code, this bug shall be reported.
+* `starlingx` is another possible version value for Openstack clouds.
 
+Associate Cloud site to a Complex in ONAP AAI:
 
 ::
 
   curl -X PUT \
-    https://aai.api.sparky.simpledemo.onap.org:30233/aai/v16/cloud-infrastructure/cloud-regions/cloud-region/MyCompanyName/INTEGRATION_CENTER/relationship-list/relationship \
+    https://aai.api.sparky.simpledemo.onap.org:30233/aai/v16/cloud-infrastructure/cloud-regions/cloud-region/MyCompanyName/ONAP_Cloud_Region_Name/relationship-list/relationship \
     -H 'Accept: application/json' \
     -H 'Authorization: Basic QUFJOkFBSQ==' \
     -H 'Content-Type: application/json' \
@@ -318,38 +356,6 @@ Check the Cloud Site creation in ONAP AAI:
     -H 'cache-control: no-cache' -k
 
 
-Associate an Availability zone to a Cloud site in ONAP AAI:
-
-::
-
-  curl -X PUT \
-    https://aai.api.sparky.simpledemo.onap.org:30233/aai/v16/cloud-infrastructure/cloud-regions/cloud-region/MyCompanyName/INTEGRATION_CENTER/availability-zones/availability-zone/brittany \
-    -H 'Accept: application/json' \
-    -H 'Authorization: Basic QUFJOkFBSQ==' \
-    -H 'Content-Type: application/json' \
-    -H 'X-FromAppId: AAI' \
-    -H 'X-TransactionId: get_aai_subscr' \
-    -H 'cache-control: no-cache' \
-    -d '{
-      "availability-zone-name": "brittany",
-      "hypervisor-type": "KVM"
-  }'
-
-
-Check the operation:
-
-::
-
-  curl -X GET \
-    https://aai.api.sparky.simpledemo.onap.org:30233/aai/v16/cloud-infrastructure/cloud-regions/cloud-region/MyCompanyName/INTEGRATION_CENTER/availability-zones \
-    -H 'Accept: application/json' \
-    -H 'Authorization: Basic QUFJOkFBSQ==' \
-    -H 'Content-Type: application/json' \
-    -H 'X-FromAppId: AAI' \
-    -H 'X-TransactionId: 808b54e3-e563-4144-a1b9-e24e2ed93d4f' \
-    -H 'cache-control: no-cache'
-
-
 
 STEP 3 : Register the Cloud Site in ONAP Multicloud
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -357,7 +363,7 @@ STEP 3 : Register the Cloud Site in ONAP Multicloud
 ::
 
   curl -X POST \
-  http://msb.api.discovery.simpledemo.onap.org:30280/api/multicloud/v1/MyCompanyName_INTEGRATION_CENTER/registry \
+  https://msb.api.discovery.simpledemo.onap.org:30283/api/multicloud/v1/MyCompanyName/ONAP_Cloud_Region_Name/registry \
   -H 'Accept: application/json' \
   -H 'Cache-Control: no-cache' \
   -H 'Content-Type: application/json' \
@@ -368,7 +374,7 @@ check registration:
 ::
 
   curl -X GET \
-  https://aai.api.sparky.simpledemo.onap.org:30233/aai/v16/cloud-infrastructure/cloud-regions/cloud-region/MyCompanyName/INTEGRATION_CENTER?depth=all \
+  https://aai.api.sparky.simpledemo.onap.org:30233/aai/v16/cloud-infrastructure/cloud-regions/cloud-region/MyCompanyName/ONAP_Cloud_Region_Name?depth=all \
   -H 'Accept: application/json' \
   -H 'Authorization: Basic QUFJOkFBSQ==' \
   -H 'Cache-Control: no-cache' \
@@ -376,3 +382,23 @@ check registration:
   -H 'Real-Time: true' \
   -H 'X-FromAppId: jimmy-postman' \
   -H 'X-TransactionId: 9999' -k
+
+The registration is successfull if at least, the field `identity-url` is
+updated with the multicloud http url. In addition, all the cloud information
+are loaded in AAI (Flavors, images, etc) but only
+
+* if ORCHESTRATOR value is set to `multicloud` in cloud_sites database table
+* and if the Openstack cloud is configured to support only keystone v2 or v3
+  having the version set in the service url. Multicloud pike and starlingx
+  plugins do not support an Openstack cloud that exposes both v2 and v3.
+
+::
+
+  openstack endpoint list --service keystone
+  +----------------------------------+-----------+--------------+--------------+---------+-----------+-----------------------------------+
+  | ID                               | Region    | Service Name | Service Type | Enabled | Interface | URL                               |
+  +----------------------------------+-----------+--------------+--------------+---------+-----------+-----------------------------------+
+  | 53c0016ad22144b2883b3a9487206a4b | RegionOne | keystone     | identity     | True    | public    | https://specific_url:5000/v3      |
+  | 85a7a334353a4b028d8005a454b6578f | RegionOne | keystone     | identity     | True    | admin     | http://10.x.x.9:35357/v3          |
+  | 8d5274cd66884ec7b0e3edd965a53f69 | RegionOne | keystone     | identity     | True    | internal  | http://10.x.x.9:5000/v3           |
+  +----------------------------------+-----------+--------------+--------------+---------+-----------+-----------------------------------+
index 97b7c24..a3b442a 160000 (submodule)
@@ -1 +1 @@
-Subproject commit 97b7c2435bf2fb9f2e27593c06b9b85fc4dc70aa
+Subproject commit a3b442a09aa3666662003d7c8a5ed69ee24a373e
index 3459b8c..226606f 160000 (submodule)
@@ -1 +1 @@
-Subproject commit 3459b8ceb782ab6cb582c1f8e085088016c91d33
+Subproject commit 226606f0ac152a01f55964d1a4764b55ae38d387
index 7bbb02c..207bfb1 160000 (submodule)
@@ -1 +1 @@
-Subproject commit 7bbb02c6b894d63e39dfbe6dc8f59cd7bad7e748
+Subproject commit 207bfb1944831973a665fdb26227a0290f57120f
index 20b07e3..077b1ab 160000 (submodule)
@@ -1 +1 @@
-Subproject commit 20b07e37990f1926d7b3cb45542b76c0336f9f19
+Subproject commit 077b1ab152c61695ac4d007035dfb81e9aef2c61
index fc4bb34..11be249 160000 (submodule)
@@ -1 +1 @@
-Subproject commit fc4bb348c8a8b4a5d5f77065b8ebbca16d6ce5b8
+Subproject commit 11be2495af543b23fe3396f65b3aeb240684f8dd
index de4fec0..2c4a12c 160000 (submodule)
@@ -1 +1 @@
-Subproject commit de4fec0391bbf1d838ebc6e18f3f307dc6885319
+Subproject commit 2c4a12c3108b49169ed42eaa8bf63e35ec9ac1fa
index 2d14d6d..30c70c4 160000 (submodule)
@@ -1 +1 @@
-Subproject commit 2d14d6dff3456430022efe6cf3607c9f8794a297
+Subproject commit 30c70c4535d3abd691970d244ff13c58b4142480
index 9040e0f..c1ae66b 160000 (submodule)
@@ -1 +1 @@
-Subproject commit 9040e0f71c3794bd1b56e2569f95795311ba0cc6
+Subproject commit c1ae66b947edefe90ffb9c788db1ee75779b0624
index 73c4103..908a257 160000 (submodule)
@@ -1 +1 @@
-Subproject commit 73c410322a99c154b3241167f992e28f0b495449
+Subproject commit 908a25779b2a00835c18f89d09230ab72a82ea7b
index 47aa1d9..2479a07 160000 (submodule)
@@ -1 +1 @@
-Subproject commit 47aa1d9d81d42c23f128b5bc7fec52b3f404cc8b
+Subproject commit 2479a0739895b15a13a07aa8260598483249c621
index d35491b..2a35410 160000 (submodule)
@@ -1 +1 @@
-Subproject commit d35491b7dc4a85b546179f8d7f00a389bfbded49
+Subproject commit 2a35410560f1c22ed12cd137cbf843e36f74740e
index 9277729..fe89262 160000 (submodule)
@@ -1 +1 @@
-Subproject commit 9277729f6cd6fdc0313b98d303fddff2ca8a63af
+Subproject commit fe89262d4d2894c664309d68ee81ac54d80559d7
index 448a16e..769eebc 160000 (submodule)
@@ -1 +1 @@
-Subproject commit 448a16ef7f4816620fb45e842a664c6e6dc65c52
+Subproject commit 769eebc4d0069f37625b2ac0a5564287e1163111
index 822d7c8..6c6f1ee 160000 (submodule)
@@ -1 +1 @@
-Subproject commit 822d7c8c8bbe020a5f39088eb4a68cd48c7f0d74
+Subproject commit 6c6f1ee4a70d21df62d6db855a83adb50ec24ff4
index ffd9af9..f81c0c7 160000 (submodule)
@@ -1 +1 @@
-Subproject commit ffd9af970318c1f5a0bad46d7aad5d4611414aae
+Subproject commit f81c0c718043517218d55908bdad0bfcada9a969
index 8acb01d..0ef638b 160000 (submodule)
@@ -1 +1 @@
-Subproject commit 8acb01dfb8a8fb2f6f77f154382933283b269566
+Subproject commit 0ef638b2eb44c9f473e5ad8bea119845d968fde7
index e230b84..92149ee 160000 (submodule)
@@ -1 +1 @@
-Subproject commit e230b8417389625b80b1e0f39405b8dc73322c78
+Subproject commit 92149eee8b918dac402a325696a2ee751cca82ee
index ef4e7b5..8f37667 160000 (submodule)
@@ -1 +1 @@
-Subproject commit ef4e7b50f4dc76ca042ddda76cdcf4e5ed10d9f4
+Subproject commit 8f37667d999101c2e4e395d810376173a5714794
index ae24adb..e799a91 160000 (submodule)
@@ -1 +1 @@
-Subproject commit ae24adb337bd7f362c2a5e8fb6ef92e2f02ccd8b
+Subproject commit e799a913c47aaf056ddc2aa0d51d4e6435935c17
index 6b283d0..5141de4 160000 (submodule)
@@ -1 +1 @@
-Subproject commit 6b283d0e5b0d0b1e448e9b1ce719ce7d17e6d7e9
+Subproject commit 5141de456755eb48ba1e3c2244dcdef872c623ce
index 975f356..1969910 160000 (submodule)
@@ -1 +1 @@
-Subproject commit 975f35644dca14ce3768187a2e3c8675273f8d44
+Subproject commit 19699104d4cacbf4eb0202aecbe4fcf377bcc157
index 4bfa2df..794218e 160000 (submodule)
@@ -1 +1 @@
-Subproject commit 4bfa2df6e5735b0060a88e4661f38b955094d1a1
+Subproject commit 794218e76ef533adf10815c789c513721336ea4d
index 729fc6d..adbae45 160000 (submodule)
@@ -1 +1 @@
-Subproject commit 729fc6d5bb4e2b1207ee81a12018b4d82275a952
+Subproject commit adbae45aa88239c26044749ff11dc0e5e60f04c7
index b24cf55..2cc3e95 160000 (submodule)
@@ -1 +1 @@
-Subproject commit b24cf55f39f1d67795ae6792440c9e5c151d120b
+Subproject commit 2cc3e9501afbf087517f80f4f30881bb9631315f
index 7b0b9c4..d97c4f2 160000 (submodule)
@@ -1 +1 @@
-Subproject commit 7b0b9c46afa26f2ac193804e89803c176e1df287
+Subproject commit d97c4f2d16f4ae9bee476fd56059340f3ed2beae
index b857497..2f3f911 160000 (submodule)
@@ -1 +1 @@
-Subproject commit b857497690e83a04ff496edb2a0ec582ac67e394
+Subproject commit 2f3f911de8295db4dfefbffe728606f756fc1033
index a6b7b70..d2fffde 160000 (submodule)
@@ -1 +1 @@
-Subproject commit a6b7b70c273ad869f4a3ea77f9717b10cdaf1620
+Subproject commit d2fffdecbe538de94a6505c93d3e8ade82faa604