Issue-ID: MODELING-289
Change-Id: Iba353d152b4895a93d0d41ac58afd63f1845c5d4
Signed-off-by: dyh <dengyuanhong@chinamobile.com>
from catalog.pub.config.config import CATALOG_ROOT_PATH, CATALOG_URL_PATH
from catalog.pub.config.config import REG_TO_MSB_REG_PARAM
from catalog.pub.config.config import CATALOG_ROOT_PATH, CATALOG_URL_PATH
from catalog.pub.config.config import REG_TO_MSB_REG_PARAM
-from catalog.pub.database.models import NSPackageModel
+from catalog.pub.database.models import NSPackageModel, VnfPackageModel, PnfPackageModel
from catalog.pub.exceptions import CatalogException
from catalog.pub.msapi import sdc
from catalog.pub.utils import toscaparser
from catalog.pub.exceptions import CatalogException
from catalog.pub.msapi import sdc
from catalog.pub.utils import toscaparser
if NSPackageModel.objects.filter(nsPackageId=csar_id):
return [1, "NS CSAR(%s) already exists." % csar_id]
if NSPackageModel.objects.filter(nsPackageId=csar_id):
return [1, "NS CSAR(%s) already exists." % csar_id]
- artifact = sdc.get_artifact(sdc.ASSETTYPE_SERVICES, csar_id)
+ ns = sdc.get_asset(sdc.ASSETTYPE_SERVICES, csar_id)
+ # check if the related resources exist
+ resources = ns.get('resources', None)
+ if resources:
+ for resource in resources:
+ if not VnfPackageModel.objects.filter(vnfPackageId=resource['resourceUUID']) and \
+ not PnfPackageModel.objects.filter(pnfPackageId=resource['resourceUUID']):
+ logger.error("Resource [%s] is not distributed.", resource['resourceUUID'])
+ raise CatalogException("Resource (%s) is not distributed." % resource['resourceUUID'])
+
+ # download csar package
local_path = os.path.join(CATALOG_ROOT_PATH, csar_id)
local_path = os.path.join(CATALOG_ROOT_PATH, csar_id)
- csar_name = "%s.csar" % artifact.get("name", csar_id)
- local_file_name = sdc.download_artifacts(artifact["toscaModelURL"], local_path, csar_name)
+ csar_name = "%s.csar" % ns.get("name", csar_id)
+ local_file_name = sdc.download_artifacts(ns["toscaModelURL"], local_path, csar_name)
if local_file_name.endswith(".csar") or local_file_name.endswith(".zip"):
artifact_vnf_file = fileutil.unzip_file(local_file_name, local_path, "Artifacts/Deployment/OTHER/ns.csar")
if os.path.exists(artifact_vnf_file):
if local_file_name.endswith(".csar") or local_file_name.endswith(".zip"):
artifact_vnf_file = fileutil.unzip_file(local_file_name, local_path, "Artifacts/Deployment/OTHER/ns.csar")
if os.path.exists(artifact_vnf_file):
@mock.patch.object(restcall, 'call_req')
def test_ns_pkg_distribute_when_csar_not_exist(self, mock_call_req):
@mock.patch.object(restcall, 'call_req')
def test_ns_pkg_distribute_when_csar_not_exist(self, mock_call_req):
- mock_call_req.return_value = [0, "[]", '200']
+ mock_call_req.return_value = [0, "{}", '200']
resp = self.client.post(
"/api/catalog/v1/nspackages", {"csarId": "1"}, format='json')
self.assertEqual(resp.status_code, status.HTTP_202_ACCEPTED)
self.assertEqual("failed", resp.data["status"])
self.assertEqual(
resp = self.client.post(
"/api/catalog/v1/nspackages", {"csarId": "1"}, format='json')
self.assertEqual(resp.status_code, status.HTTP_202_ACCEPTED)
self.assertEqual("failed", resp.data["status"])
self.assertEqual(
- "Failed to query artifact(services,1) from sdc.",
+ "Failed to get asset(services, 1) from sdc.",
resp.data["statusDescription"])
@mock.patch.object(restcall, 'call_req')
resp.data["statusDescription"])
@mock.patch.object(restcall, 'call_req')
self, mock_parse_nsd, mock_download_artifacts, mock_call_req):
mock_parse_nsd.return_value = json.JSONEncoder().encode(self.nsd_data)
mock_download_artifacts.return_value = "/home/vcpe.csar"
self, mock_parse_nsd, mock_download_artifacts, mock_call_req):
mock_parse_nsd.return_value = json.JSONEncoder().encode(self.nsd_data)
mock_download_artifacts.return_value = "/home/vcpe.csar"
- mock_call_req.return_value = [0, json.JSONEncoder().encode([{
+ mock_call_req.return_value = [0, json.JSONEncoder().encode({
"uuid": "1",
"toscaModelURL": "https://127.0.0.1:1234/sdc/v1/vcpe.csar",
"distributionStatus": "DISTRIBUTED"
"uuid": "1",
"toscaModelURL": "https://127.0.0.1:1234/sdc/v1/vcpe.csar",
"distributionStatus": "DISTRIBUTED"
NSPackageModel(nsPackageId="2", nsdId="VCPE_NS").save()
resp = self.client.post(
"/api/catalog/v1/nspackages", {"csarId": "1"}, format='json')
NSPackageModel(nsPackageId="2", nsdId="VCPE_NS").save()
resp = self.client.post(
"/api/catalog/v1/nspackages", {"csarId": "1"}, format='json')
self, mock_parse_nsd, mock_download_artifacts, mock_call_req):
mock_parse_nsd.return_value = json.JSONEncoder().encode(self.nsd_data)
mock_download_artifacts.return_value = "/home/vcpe.csar"
self, mock_parse_nsd, mock_download_artifacts, mock_call_req):
mock_parse_nsd.return_value = json.JSONEncoder().encode(self.nsd_data)
mock_download_artifacts.return_value = "/home/vcpe.csar"
- mock_call_req.return_value = [0, json.JSONEncoder().encode([{
+ mock_call_req.return_value = [0, json.JSONEncoder().encode({
"uuid": "1",
"toscaModelURL": "https://127.0.0.1:1234/sdc/v1/vcpe.csar",
"distributionStatus": "DISTRIBUTED",
"uuid": "1",
"toscaModelURL": "https://127.0.0.1:1234/sdc/v1/vcpe.csar",
"distributionStatus": "DISTRIBUTED",
resp = self.client.post(
"/api/catalog/v1/nspackages", {"csarId": "1"}, format='json')
self.assertEqual(resp.status_code, status.HTTP_202_ACCEPTED)
resp = self.client.post(
"/api/catalog/v1/nspackages", {"csarId": "1"}, format='json')
self.assertEqual(resp.status_code, status.HTTP_202_ACCEPTED)
self, mock_parse_nsd, mock_download_artifacts, mock_call_req):
mock_parse_nsd.return_value = json.JSONEncoder().encode(self.nsd_data)
mock_download_artifacts.return_value = "/home/vcpe.csar"
self, mock_parse_nsd, mock_download_artifacts, mock_call_req):
mock_parse_nsd.return_value = json.JSONEncoder().encode(self.nsd_data)
mock_download_artifacts.return_value = "/home/vcpe.csar"
- mock_call_req.return_value = [0, json.JSONEncoder().encode([{
+ mock_call_req.return_value = [0, json.JSONEncoder().encode({
"uuid": "1",
"toscaModelURL": "https://127.0.0.1:1234/sdc/v1/vcpe.csar",
"distributionStatus": "DISTRIBUTED"
"uuid": "1",
"toscaModelURL": "https://127.0.0.1:1234/sdc/v1/vcpe.csar",
"distributionStatus": "DISTRIBUTED"
VnfPackageModel(vnfPackageId="1", vnfdId="vcpe_vfw_zte_1_0").save()
PnfPackageModel(pnfPackageId="1", pnfdId="m6000_s").save()
resp = self.client.post(
VnfPackageModel(vnfPackageId="1", vnfdId="vcpe_vfw_zte_1_0").save()
PnfPackageModel(pnfPackageId="1", pnfdId="m6000_s").save()
resp = self.client.post(
"CSAR(1) distributed successfully.",
resp.data["statusDescription"])
"CSAR(1) distributed successfully.",
resp.data["statusDescription"])
- @mock.patch.object(sdc, 'get_artifacts')
- def test_ns_when_not_distributed_by_sdc(self, mock_get_artifacts):
- mock_get_artifacts.return_value = [{
+ @mock.patch.object(restcall, 'call_req')
+ def test_ns_when_not_distributed_by_sdc(self, mock_call_req):
+ mock_call_req.return_value = [0, json.JSONEncoder().encode({
- "invariantUUID": "63eaec39-ffbe-411c-a838-448f2c73f7eb",
- "name": "underlayvpn",
- "version": "2.0",
- "toscaModelURL": "/sdc/v1/catalog/resources/c94490a0-f7ef-48be-b3f8-8d8662a37236/toscaModel",
- "category": "Volte",
- "subCategory": "VolteVNF",
- "resourceType": "VF",
- "lifecycleState": "CERTIFIED",
- "distributionStatus": "DISTRIBUTION_APPROVED",
- "lastUpdaterUserId": "jh0003"
- }]
+ "toscaModelURL": "https://127.0.0.1:1234/sdc/v1/vcpe.csar",
+ "distributionStatus": "DISTRIBUTION_APPROVED"
+ }), '200']
resp = self.client.post(
"/api/catalog/v1/nspackages", {"csarId": "1"}, format='json')
self.assertEqual(resp.status_code, status.HTTP_202_ACCEPTED)
self.assertEqual("failed", resp.data["status"])
self.assertEqual(
resp = self.client.post(
"/api/catalog/v1/nspackages", {"csarId": "1"}, format='json')
self.assertEqual(resp.status_code, status.HTTP_202_ACCEPTED)
self.assertEqual("failed", resp.data["status"])
self.assertEqual(
- "The artifact (services,1) is not distributed from sdc.",
+ "The asset (services,1) is not distributed from sdc.",
resp.data["statusDescription"])
##########################################################################
resp.data["statusDescription"])
##########################################################################
logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
raise CatalogException("Failed to get asset(%s, %s) from sdc." % (asset_type, uuid))
asset = json.JSONDecoder().decode(ret[1])
logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
raise CatalogException("Failed to get asset(%s, %s) from sdc." % (asset_type, uuid))
asset = json.JSONDecoder().decode(ret[1])
+ if len(asset) == 0:
+ raise CatalogException("Failed to get asset(%s, %s) from sdc." % (asset_type, uuid))
if asset.get("distributionStatus", None) != DISTRIBUTED:
raise CatalogException("The asset (%s,%s) is not distributed from sdc." % (asset_type, uuid))
else:
if asset.get("distributionStatus", None) != DISTRIBUTED:
raise CatalogException("The asset (%s,%s) is not distributed from sdc." % (asset_type, uuid))
else:
from catalog.pub.config import config as pub_config
from logging import config as log_config
from onaplogging import monkey
from catalog.pub.config import config as pub_config
from logging import config as log_config
from onaplogging import monkey
monkey.patch_all()
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
monkey.patch_all()
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
'maxBytes': 1024 * 1024 * 50,
'backupCount': 5,
},
'maxBytes': 1024 * 1024 * 50,
'backupCount': 5,
},
+ 'console': {
+ 'level': 'DEBUG',
+ 'class': 'logging.StreamHandler',
+ 'formatter': 'standard'
+ },
},
'loggers': {
'catalog': {
},
'loggers': {
'catalog': {
- 'handlers': ['catalog_handler'],
+ 'handlers': ['catalog_handler', 'console'],
'level': 'DEBUG',
'propagate': False
},
'level': 'DEBUG',
'propagate': False
},
import mock
from catalog.pub.utils import idutil
import mock
from catalog.pub.utils import idutil
idutil.get_auto_id = mock.Mock()
idutil.get_auto_id.return_value = 1
idutil.get_auto_id = mock.Mock()
idutil.get_auto_id.return_value = 1