diff options
author | Sastry Isukapalli <sastry@research.att.com> | 2018-01-11 14:45:11 -0500 |
---|---|---|
committer | Sastry Isukapalli <sastry@research.att.com> | 2018-01-11 14:46:07 -0500 |
commit | 524573f21dfc3d88b1512850d52da7e5b545cf9d (patch) | |
tree | 27c3c98a9b7b215b61feef3a1c92526ee6a86a80 /models | |
parent | d51c20ced007294d86e560f3bc9f5812cc17f193 (diff) |
Seed code for OSDF placement adapter
Issue-ID: OPTFRA-46
Change-Id: Ia1e5ecae1052d0ef93d99cf560216822051c438f
Signed-off-by: Sastry Isukapalli <sastry@research.att.com>
Diffstat (limited to 'models')
-rwxr-xr-x | models/api/common.py | 54 | ||||
-rw-r--r-- | models/api/placementRequest.py | 124 | ||||
-rw-r--r-- | models/api/placementResponse.py | 57 |
3 files changed, 235 insertions, 0 deletions
diff --git a/models/api/common.py b/models/api/common.py new file mode 100755 index 0000000..0d2d0eb --- /dev/null +++ b/models/api/common.py @@ -0,0 +1,54 @@ +# -------------------------------------------------------------------------
+# Copyright (c) 2015-2017 AT&T Intellectual Property
+#
+# 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 datetime
+from pprint import pformat
+
+from dateutil.parser import parse
+from schematics.exceptions import ConversionError
+from schematics.models import Model
+from schematics.types import DateTimeType
+
+
+class OSDFModel(Model):
+ """Extends generic model with a couple of extra methods"""
+ def __str__(self):
+ """Return values of object's attributes -- excluding hidden or callable ones"""
+ def _str_format(x):
+ """Coerce as string for some special objects"""
+ return str(x) if isinstance(x, datetime.datetime) else x
+
+ z1 = dict((x, getattr(self, x)) for x in dir(self)
+ if not x.startswith("_") and not callable(getattr(self, x)))
+ z1 = dict((x, _str_format(y)) for x, y in z1.items())
+ return pformat(z1, depth=4, indent=2, width=1000)
+
+ def __repr__(self):
+ """Return values of object's attributes -- excluding hidden or callable ones"""
+ return self.__str__()
+
+
+class CustomISODateType(DateTimeType):
+ """Schematics doesn't support full ISO, so we use custom one"""
+ def to_native(self, value, context=None):
+ if isinstance(value, datetime.datetime):
+ return value
+ try:
+ return parse(value)
+ except:
+ raise ConversionError(u'Invalid timestamp {}'.format(value))
diff --git a/models/api/placementRequest.py b/models/api/placementRequest.py new file mode 100644 index 0000000..73eac75 --- /dev/null +++ b/models/api/placementRequest.py @@ -0,0 +1,124 @@ +# ------------------------------------------------------------------------- +# Copyright (c) 2015-2017 AT&T Intellectual Property +# +# 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 .common import OSDFModel +from schematics.types import StringType, URLType, IntType, FloatType +from schematics.types.compound import ModelType, ListType + + +class RequestInfo(OSDFModel): + """Info for northbound request from client such as SO""" + transactionId = StringType(required=True) + requestId = StringType(required=True) + callbackUrl = URLType(required=True) + sourceId = StringType(required=True) + optimizer = ListType(StringType()) + numSolutions = IntType() + timeout = IntType() + requestType = StringType() + + +class CandidateInfo(OSDFModel): + """Preferred candidate for a resource (sent as part of a request from client)""" + candidateType = StringType(required=True) + candidates = ListType(StringType(required=True)) + + +class ResourceModelInfo(OSDFModel): + """Model information for a specific resource""" + modelCustomizationId = StringType(required=True) + modelInvariantId = StringType(required=True) + modelName = StringType() + modelVersion = StringType() + modelVersionId = StringType() + modelType = StringType() + operationalStatus = StringType() + + +class ExistingLicenseInfo(OSDFModel): + entitlementPoolUUID = ListType(StringType()) + licenseKeyGroupUUID = ListType(StringType()) + + +class LicenseDemand(OSDFModel): + resourceInstanceType = StringType(required=True) + serviceResourceId = StringType(required=True) + resourceModuleName = StringType(required=True) + resourceModelInfo = ModelType(ResourceModelInfo) + existingLicense = ModelType(ExistingLicenseInfo) + + +class PlacementDemand(OSDFModel): + resourceInstanceType = StringType(required=True) + serviceResourceId = StringType(required=True) + resourceModuleName = StringType(required=True) + exclusionCandidateInfo = ListType(ModelType(CandidateInfo)) + requiredCandidateInfo = ListType(ModelType(CandidateInfo)) + resourceModelInfo = ModelType(ResourceModelInfo) + tenantId = StringType() + tenantName = StringType() + + +class ExistingPlacementInfo(OSDFModel): + serviceInstanceId = StringType(required=True) + + +class DemandInfo(OSDFModel): + """Requested resources (sent as part of a request from client)""" + placementDemand = ListType(ModelType(PlacementDemand)) + licenseDemand = ListType(ModelType(LicenseDemand)) + + +class SubscriberInfo(OSDFModel): + """Details on the customer that subscribes to the VNFs""" + globalSubscriberId = StringType(required=True) + subscriberName = StringType() + subscriberCommonSiteId = StringType() + + +class ServiceModelInfo(OSDFModel): + """ASDC Service model information""" + modelType = StringType(required=True) + modelInvariantId = StringType(required=True) + modelVersionId = StringType(required=True) + modelName = StringType(required=True) + modelVersion = StringType(required=True) + + +class Location(OSDFModel): + latitude = FloatType(required=True) + longitude = FloatType(required=True) + + +class PlacementInfo(OSDFModel): + """Information specific to placement optimization""" + serviceModelInfo = ModelType(ServiceModelInfo) + subscriberInfo = ModelType(SubscriberInfo) + demandInfo = ModelType(DemandInfo, required=True) + orderInfo = StringType() + policyId = ListType(StringType()) + serviceInstanceId = StringType() + existingPlacement = ModelType(ExistingPlacementInfo) + location = ModelType(Location) + serviceType = StringType() + + +class PlacementAPI(OSDFModel): + """Request for placement optimization (specific to optimization and additional metadata""" + requestInfo = ModelType(RequestInfo, required=True) + placementInfo = ModelType(PlacementInfo, required=True) diff --git a/models/api/placementResponse.py b/models/api/placementResponse.py new file mode 100644 index 0000000..e9746d6 --- /dev/null +++ b/models/api/placementResponse.py @@ -0,0 +1,57 @@ +# ------------------------------------------------------------------------- +# Copyright (c) 2015-2017 AT&T Intellectual Property +# +# 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 .common import OSDFModel +from schematics.types import StringType +from schematics.types.compound import ModelType, ListType + + +# TODO: update osdf.models + +class LicenseSolution(OSDFModel): + serviceResourceId = StringType(required=True) + resourceModuleName = StringType(required=True) + entitlementPoolList = ListType(StringType(required=True)) + licenseKeyGroupList = ListType(StringType(required=True)) + + +class AssignmentInfo(OSDFModel): + variableName = StringType(required=True) + variableValue = StringType(required=True) + + +class PlacementSolution(OSDFModel): + serviceResourceId = StringType(required=True) + resourceModuleName = StringType(required=True) + inventoryType = StringType(required=True) + serviceInstanceId = StringType() + cloudRegionId = StringType() + assignmentInfo = ListType(ModelType(AssignmentInfo)) + + +class SolutionInfo(OSDFModel): + placement = ListType(ModelType(PlacementSolution), min_size=1) + license = ListType(ModelType(LicenseSolution), min_size=1) + + +class PlacementResponse(OSDFModel): + transactionId = StringType(required=True) + requestId = StringType(required=True) + requestState = StringType(required=True) + statusMessage = StringType(required=True) + solutionInfo = ModelType(SolutionInfo) |