aboutsummaryrefslogtreecommitdiffstats
path: root/src/onapsdk/sdc/properties.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/onapsdk/sdc/properties.py')
-rw-r--r--src/onapsdk/sdc/properties.py202
1 files changed, 202 insertions, 0 deletions
diff --git a/src/onapsdk/sdc/properties.py b/src/onapsdk/sdc/properties.py
new file mode 100644
index 0000000..f7e07a0
--- /dev/null
+++ b/src/onapsdk/sdc/properties.py
@@ -0,0 +1,202 @@
+"""Service properties module."""
+# Copyright 2022 Orange, Deutsche Telekom AG
+#
+# 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 dataclasses import dataclass, field
+from typing import Any, Dict, List, Optional
+
+from onapsdk.exceptions import ParameterError
+
+
+@dataclass
+class Input:
+ """Property input dataclass."""
+
+ unique_id: str
+ input_type: str
+ name: str
+ sdc_resource: "SdcResource"
+ _default_value: Optional[Any] = field(repr=False, default=None)
+
+ @property
+ def default_value(self) -> Any:
+ """Input default value.
+
+ Returns:
+ Any: Input default value
+
+ """
+ return self._default_value
+
+ @default_value.setter
+ def default_value(self, value: Any) -> None:
+ """Set input default value.
+
+ Use related sdc_resource "set_input_default_value"
+ method to set default value in SDC. We use that
+ because different types of SDC resources has different
+ urls to call SDC API.
+
+ Args:
+ value (Any): Default value to set
+
+ """
+ self.sdc_resource.set_input_default_value(self, value)
+ self._default_value = value
+
+@dataclass
+class NestedInput:
+ """Dataclass used for nested input declaration."""
+
+ sdc_resource: "SdcResource"
+ input_obj: Input
+
+
+class Property: # pylint: disable=too-many-instance-attributes, too-few-public-methods
+ """Service property class."""
+
+ def __init__(self, # pylint: disable=too-many-arguments
+ name: str,
+ property_type: str,
+ description: Optional[str] = None,
+ unique_id: Optional[str] = None,
+ parent_unique_id: Optional[str] = None,
+ sdc_resource: Optional["SdcResource"] = None,
+ value: Optional[Any] = None,
+ get_input_values: Optional[List[Dict[str, str]]] = None) -> None:
+ """Property class initialization.
+
+ Args:
+ property_type (str): [description]
+ description (Optional[str], optional): [description]. Defaults to None.
+ unique_id (Optional[str], optional): [description]. Defaults to None.
+ parent_unique_id (Optional[str], optional): [description]. Defaults to None.
+ sdc_resource (Optional[, optional): [description]. Defaults to None.
+ value (Optional[Any], optional): [description]. Defaults to None.
+ get_input_values (Optional[List[Dict[str, str]]], optional): [description].
+ Defaults to None.
+ """
+ self.name: str = name
+ self.property_type: str = property_type
+ self.description: str = description
+ self.unique_id: str = unique_id
+ self.parent_unique_id: str = parent_unique_id
+ self.sdc_resource: "SdcResource" = sdc_resource
+ self._value: Any = value
+ self.get_input_values: List[Dict[str, str]] = get_input_values
+
+ def __repr__(self) -> str:
+ """Property object human readable representation.
+
+ Returns:
+ str: Property human readable representation
+
+ """
+ return f"Property(name={self.name}, property_type={self.property_type})"
+
+ def __eq__(self, obj: "Property") -> bool:
+ """Check if two Property object are equal.
+
+ Args:
+ obj (Property): Object to compare
+
+ Returns:
+ bool: True if objects are equal, False otherwise
+
+ """
+ return self.name == obj.name and self.property_type == obj.property_type
+
+ @property
+ def input(self) -> Input:
+ """Property input.
+
+ Returns property Input object.
+ Returns None if property has no associated input.
+
+ Raises:
+ ParameterError: Input has no associated SdcResource
+
+ ParameterError: Input for given property does not exits.
+ It shouldn't ever happen, but it's possible if after you
+ get property object someone delete input.
+
+ Returns:
+ Input: Property input object.
+
+ """
+ if not self.sdc_resource:
+ raise ParameterError("Property has no associated SdcResource")
+ if not self.get_input_values:
+ return None
+ try:
+ return next(filter(lambda x: x.unique_id == self.get_input_values[0].get("inputId"),
+ self.sdc_resource.inputs))
+ except StopIteration:
+ raise ParameterError("Property input does not exist")
+
+ @property
+ def value(self) -> Any:
+ """Value property.
+
+ Get property value.
+
+ Returns:
+ Any: Property value
+
+ """
+ return self._value
+
+ @value.setter
+ def value(self, val: Any) -> Any:
+ if self.sdc_resource:
+ self.sdc_resource.set_property_value(self, val)
+ self._value = val
+
+
+@dataclass
+class ComponentProperty:
+ """Component property dataclass.
+
+ Component properties are inputs objects in SDC, but in logic
+ it's a property.
+
+ """
+
+ unique_id: str
+ property_type: str
+ name: str
+ component: "Component"
+ _value: Optional[Any] = field(repr=False, default=None)
+
+ @property
+ def value(self) -> Any:
+ """Property value getter.
+
+ Returns:
+ Any: Property value
+
+ """
+ return self._value
+
+ @value.setter
+ def value(self, val: Any) -> None:
+ """Property value setter.
+
+ Set value both in an object and in SDC using it's HTTP API.
+
+ Args:
+ val (Any): Property value to set
+
+ """
+ self.component.set_property_value(self, val)
+ self._value = val