--- /dev/null
+# Copyright 2021 Canonical Ltd.
+#
+# 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 typing import NoReturn
+
+from n2vc.utils import get_ee_id_components
+
+
+class RelationEndpoint:
+ """Represents an endpoint of an application"""
+
+ def __init__(self, ee_id: str, vca_id: str, endpoint_name: str) -> NoReturn:
+ """
+ Args:
+ ee_id: Execution environment id.
+ Format: "<model>.<application_name>.<machine_id>".
+ vca_id: Id of the VCA. Identifies the Juju Controller
+ where the application is deployed
+ endpoint_name: Name of the endpoint for the relation
+ """
+ ee_components = get_ee_id_components(ee_id)
+ self._model_name = ee_components[0]
+ self._application_name = ee_components[1]
+ self._vca_id = vca_id
+ self._endpoint_name = endpoint_name
+
+ @property
+ def application_name(self) -> str:
+ """Returns the application name"""
+ return self._application_name
+
+ @property
+ def endpoint(self) -> str:
+ """Returns the application name and the endpoint. Format: <application>:<endpoint>"""
+ return f"{self.application_name}:{self._endpoint_name}"
+
+ @property
+ def endpoint_name(self) -> str:
+ """Returns the endpoint name"""
+ return self._endpoint_name
+
+ @property
+ def model_name(self) -> str:
+ """Returns the model name"""
+ return self._model_name
+
+ @property
+ def vca_id(self) -> str:
+ """Returns the vca id"""
+ return self._vca_id
+
+ def __str__(self) -> str:
+ app = self.application_name
+ endpoint = self.endpoint_name
+ model = self.model_name
+ vca = self.vca_id
+ return f"{app}:{endpoint} (model: {model}, vca: {vca})"
+
+
+class Offer:
+ """Represents a juju offer"""
+
+ def __init__(self, url: str, vca_id: str = None) -> NoReturn:
+ """
+ Args:
+ url: Offer url. Format: <user>/<model>.<offer-name>.
+ """
+ self._url = url
+ self._username = url.split(".")[0].split("/")[0]
+ self._model_name = url.split(".")[0].split("/")[1]
+ self._name = url.split(".")[1]
+ self._vca_id = vca_id
+
+ @property
+ def model_name(self) -> str:
+ """Returns the model name"""
+ return self._model_name
+
+ @property
+ def name(self) -> str:
+ """Returns the offer name"""
+ return self._name
+
+ @property
+ def username(self) -> str:
+ """Returns the username"""
+ return self._username
+
+ @property
+ def url(self) -> str:
+ """Returns the offer url"""
+ return self._url
+
+ @property
+ def vca_id(self) -> str:
+ """Returns the vca id"""
+ return self._vca_id