diff --git a/.gitmodules b/.gitmodules index 221778f6ab145e98d85a05ba09a792e014effed8..22e99acb5c66dc9b43cee4397e2f4746882d0e01 100644 --- a/.gitmodules +++ b/.gitmodules @@ -58,3 +58,12 @@ [submodule "charm-packages/native_k8s_charm_vnf/charms/nginx-k8s/mod/operator"] path = charm-packages/native_k8s_charm_vnf/charms/nginx-k8s/mod/operator url = https://github.com/canonical/operator +[submodule "charm-packages/proxy_native_relation_vnf/charms/simple_provides_proxy/mod/charms.osm"] + path = charm-packages/proxy_native_relation_vnf/charms/simple_provides_proxy/mod/charms.osm + url = https://github.com/charmed-osm/charms.osm.git +[submodule "charm-packages/proxy_native_relation_vnf/charms/simple_provides_proxy/mod/operator"] + path = charm-packages/proxy_native_relation_vnf/charms/simple_provides_proxy/mod/operator + url = https://github.com/canonical/operator.git +[submodule "charm-packages/proxy_native_relation_vnf/charms/simple_requires/mod/operator"] + path = charm-packages/proxy_native_relation_vnf/charms/simple_requires/mod/operator + url = https://github.com/canonical/operator.git diff --git a/charm-packages/proxy_native_relation_ns/icons/osm.png b/charm-packages/proxy_native_relation_ns/icons/osm.png new file mode 100644 index 0000000000000000000000000000000000000000..62012d2a2b491bdcd536d62c3c3c863c0d8c1b33 Binary files /dev/null and b/charm-packages/proxy_native_relation_ns/icons/osm.png differ diff --git a/charm-packages/proxy_native_relation_ns/proxy_native_relation_nsd.yaml b/charm-packages/proxy_native_relation_ns/proxy_native_relation_nsd.yaml new file mode 100755 index 0000000000000000000000000000000000000000..74d88c4456ded779566a13bf3263dfcb8683a48d --- /dev/null +++ b/charm-packages/proxy_native_relation_ns/proxy_native_relation_nsd.yaml @@ -0,0 +1,26 @@ +nsd:nsd-catalog: + nsd: + - id: proxy_native_relation-ns + name: proxy_native_relation-ns + short-name: proxy_native_relation-ns + description: NS with 2 VNFs with cloudinit connected by datanet and mgmtnet VLs + version: '1.0' + logo: osm.png + constituent-vnfd: + - vnfd-id-ref: proxy_native_relation-vnf + member-vnf-index: '1' + vld: + - id: mgmtnet + name: mgmtnet + short-name: mgmtnet + type: ELAN + mgmt-network: 'true' + vim-network-name: osm-ext + vnfd-connection-point-ref: + - vnfd-id-ref: proxy_native_relation-vnf + member-vnf-index-ref: '1' + vnfd-connection-point-ref: provides-mgmt + - vnfd-id-ref: proxy_native_relation-vnf + member-vnf-index-ref: '1' + vnfd-connection-point-ref: requires-mgmt + diff --git a/charm-packages/proxy_native_relation_vnf/charms/simple_provides_proxy/actions.yaml b/charm-packages/proxy_native_relation_vnf/charms/simple_provides_proxy/actions.yaml new file mode 100644 index 0000000000000000000000000000000000000000..f9882c47bba960254e0381e5b5ab1c0688de6cf5 --- /dev/null +++ b/charm-packages/proxy_native_relation_vnf/charms/simple_provides_proxy/actions.yaml @@ -0,0 +1,54 @@ +## +# Copyright 2020 Canonical Ltd. +# All rights reserved. +# +# 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. +## +touch: + description: "Touch a file on the VNF." + params: + filename: + description: "The name of the file to touch." + type: string + default: "" + required: + - filename + +# Standard OSM functions +start: + description: "Stop the service on the VNF." +stop: + description: "Stop the service on the VNF." +restart: + description: "Stop the service on the VNF." +reboot: + description: "Reboot the VNF virtual machine." +upgrade: + description: "Upgrade the software on the VNF." + +# Required by charms.osm.sshproxy +run: + description: "Run an arbitrary command" + params: + command: + description: "The command to execute." + type: string + default: "" + required: + - command +generate-ssh-key: + description: "Generate a new SSH keypair for this unit. This will replace any existing previously generated keypair." +verify-ssh-credentials: + description: "Verify that this unit can authenticate with server specified by ssh-hostname and ssh-username." +get-ssh-public-key: + description: "Get the public SSH key for this unit." diff --git a/charm-packages/proxy_native_relation_vnf/charms/simple_provides_proxy/config.yaml b/charm-packages/proxy_native_relation_vnf/charms/simple_provides_proxy/config.yaml new file mode 100644 index 0000000000000000000000000000000000000000..93e3cab01c0843418c57e4bc918eb933f2daf934 --- /dev/null +++ b/charm-packages/proxy_native_relation_vnf/charms/simple_provides_proxy/config.yaml @@ -0,0 +1,41 @@ +## +# Copyright 2020 Canonical Ltd. +# All rights reserved. +# +# 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. +## +options: + ssh-hostname: + type: string + default: "" + description: "The hostname or IP address of the machine to" + ssh-username: + type: string + default: "" + description: "The username to login as." + ssh-password: + type: string + default: "" + description: "The password used to authenticate." + ssh-public-key: + type: string + default: "" + description: "The public key of this unit." + ssh-key-type: + type: string + default: "rsa" + description: "The type of encryption to use for the SSH key." + ssh-key-bits: + type: int + default: 4096 + description: "The number of bits to use for the SSH key." diff --git a/charm-packages/proxy_native_relation_vnf/charms/simple_provides_proxy/hooks/install b/charm-packages/proxy_native_relation_vnf/charms/simple_provides_proxy/hooks/install new file mode 100755 index 0000000000000000000000000000000000000000..e23b12b7bcfddfd49d4efbc1b0ac72d92579778a --- /dev/null +++ b/charm-packages/proxy_native_relation_vnf/charms/simple_provides_proxy/hooks/install @@ -0,0 +1,65 @@ +#!/usr/bin/env python3 +## +# Copyright 2020 Canonical Ltd. +# All rights reserved. +# +# 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 sys + +sys.path.append("lib") + +from charms.osm.sshproxy import SSHProxyCharm +from ops.main import main + +class MySSHProxyCharm(SSHProxyCharm): + + def __init__(self, framework, key): + super().__init__(framework, key) + + # Listen to charm events + self.framework.observe(self.on.config_changed, self.on_config_changed) + self.framework.observe(self.on.install, self.on_install) + self.framework.observe(self.on.start, self.on_start) + + # Listen to the touch action event + self.framework.observe(self.on.touch_action, self.on_touch_action) + + def on_config_changed(self, event): + """Handle changes in configuration""" + super().on_config_changed(event) + + def on_install(self, event): + """Called when the charm is being installed""" + super().on_install(event) + + def on_start(self, event): + """Called when the charm is being started""" + super().on_start(event) + + def on_touch_action(self, event): + """Touch a file.""" + + if self.model.unit.is_leader(): + filename = event.params["filename"] + proxy = self.get_ssh_proxy() + stdout, stderr = proxy.run("touch {}".format(filename)) + event.set_results({"output": stdout}) + else: + event.fail("Unit is not leader") + return + +if __name__ == "__main__": + main(MySSHProxyCharm) + diff --git a/charm-packages/proxy_native_relation_vnf/charms/simple_provides_proxy/hooks/start b/charm-packages/proxy_native_relation_vnf/charms/simple_provides_proxy/hooks/start new file mode 100755 index 0000000000000000000000000000000000000000..e23b12b7bcfddfd49d4efbc1b0ac72d92579778a --- /dev/null +++ b/charm-packages/proxy_native_relation_vnf/charms/simple_provides_proxy/hooks/start @@ -0,0 +1,65 @@ +#!/usr/bin/env python3 +## +# Copyright 2020 Canonical Ltd. +# All rights reserved. +# +# 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 sys + +sys.path.append("lib") + +from charms.osm.sshproxy import SSHProxyCharm +from ops.main import main + +class MySSHProxyCharm(SSHProxyCharm): + + def __init__(self, framework, key): + super().__init__(framework, key) + + # Listen to charm events + self.framework.observe(self.on.config_changed, self.on_config_changed) + self.framework.observe(self.on.install, self.on_install) + self.framework.observe(self.on.start, self.on_start) + + # Listen to the touch action event + self.framework.observe(self.on.touch_action, self.on_touch_action) + + def on_config_changed(self, event): + """Handle changes in configuration""" + super().on_config_changed(event) + + def on_install(self, event): + """Called when the charm is being installed""" + super().on_install(event) + + def on_start(self, event): + """Called when the charm is being started""" + super().on_start(event) + + def on_touch_action(self, event): + """Touch a file.""" + + if self.model.unit.is_leader(): + filename = event.params["filename"] + proxy = self.get_ssh_proxy() + stdout, stderr = proxy.run("touch {}".format(filename)) + event.set_results({"output": stdout}) + else: + event.fail("Unit is not leader") + return + +if __name__ == "__main__": + main(MySSHProxyCharm) + diff --git a/charm-packages/proxy_native_relation_vnf/charms/simple_provides_proxy/hooks/upgrade-charm b/charm-packages/proxy_native_relation_vnf/charms/simple_provides_proxy/hooks/upgrade-charm new file mode 100755 index 0000000000000000000000000000000000000000..e23b12b7bcfddfd49d4efbc1b0ac72d92579778a --- /dev/null +++ b/charm-packages/proxy_native_relation_vnf/charms/simple_provides_proxy/hooks/upgrade-charm @@ -0,0 +1,65 @@ +#!/usr/bin/env python3 +## +# Copyright 2020 Canonical Ltd. +# All rights reserved. +# +# 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 sys + +sys.path.append("lib") + +from charms.osm.sshproxy import SSHProxyCharm +from ops.main import main + +class MySSHProxyCharm(SSHProxyCharm): + + def __init__(self, framework, key): + super().__init__(framework, key) + + # Listen to charm events + self.framework.observe(self.on.config_changed, self.on_config_changed) + self.framework.observe(self.on.install, self.on_install) + self.framework.observe(self.on.start, self.on_start) + + # Listen to the touch action event + self.framework.observe(self.on.touch_action, self.on_touch_action) + + def on_config_changed(self, event): + """Handle changes in configuration""" + super().on_config_changed(event) + + def on_install(self, event): + """Called when the charm is being installed""" + super().on_install(event) + + def on_start(self, event): + """Called when the charm is being started""" + super().on_start(event) + + def on_touch_action(self, event): + """Touch a file.""" + + if self.model.unit.is_leader(): + filename = event.params["filename"] + proxy = self.get_ssh_proxy() + stdout, stderr = proxy.run("touch {}".format(filename)) + event.set_results({"output": stdout}) + else: + event.fail("Unit is not leader") + return + +if __name__ == "__main__": + main(MySSHProxyCharm) + diff --git a/charm-packages/proxy_native_relation_vnf/charms/simple_provides_proxy/lib/charms b/charm-packages/proxy_native_relation_vnf/charms/simple_provides_proxy/lib/charms new file mode 120000 index 0000000000000000000000000000000000000000..5abf77aa5a04fddc6d4eb9d0d6d17e36fd00272a --- /dev/null +++ b/charm-packages/proxy_native_relation_vnf/charms/simple_provides_proxy/lib/charms @@ -0,0 +1 @@ +../mod/charms.osm/charms/ \ No newline at end of file diff --git a/charm-packages/proxy_native_relation_vnf/charms/simple_provides_proxy/lib/ops b/charm-packages/proxy_native_relation_vnf/charms/simple_provides_proxy/lib/ops new file mode 120000 index 0000000000000000000000000000000000000000..c36dab1ed4a93aee97a31b0eba0438852c5e05bf --- /dev/null +++ b/charm-packages/proxy_native_relation_vnf/charms/simple_provides_proxy/lib/ops @@ -0,0 +1 @@ +../mod/operator/ops/ \ No newline at end of file diff --git a/charm-packages/proxy_native_relation_vnf/charms/simple_provides_proxy/metadata.yaml b/charm-packages/proxy_native_relation_vnf/charms/simple_provides_proxy/metadata.yaml new file mode 100644 index 0000000000000000000000000000000000000000..76b268bfca697808056fb7386913e592df4b508d --- /dev/null +++ b/charm-packages/proxy_native_relation_vnf/charms/simple_provides_proxy/metadata.yaml @@ -0,0 +1,30 @@ +## +# Copyright 2020 Canonical Ltd. +# All rights reserved. +# +# 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. +## + +name: simple-ha-proxy +summary: A simple example proxy charm +description: | + Simple proxy charm is an example charm used in OSM Hackfests +series: + - xenial + - bionic +peers: + proxypeer: + interface: proxypeer +provides: + interface: + interface: interface \ No newline at end of file diff --git a/charm-packages/proxy_native_relation_vnf/charms/simple_provides_proxy/mod/charms.osm b/charm-packages/proxy_native_relation_vnf/charms/simple_provides_proxy/mod/charms.osm new file mode 160000 index 0000000000000000000000000000000000000000..3d517f5e42550d0b5c81aa4be20f7679020854d5 --- /dev/null +++ b/charm-packages/proxy_native_relation_vnf/charms/simple_provides_proxy/mod/charms.osm @@ -0,0 +1 @@ +Subproject commit 3d517f5e42550d0b5c81aa4be20f7679020854d5 diff --git a/charm-packages/proxy_native_relation_vnf/charms/simple_provides_proxy/mod/operator b/charm-packages/proxy_native_relation_vnf/charms/simple_provides_proxy/mod/operator new file mode 160000 index 0000000000000000000000000000000000000000..89b51be8588a19fcc9c93410707aeb5856dd8d8f --- /dev/null +++ b/charm-packages/proxy_native_relation_vnf/charms/simple_provides_proxy/mod/operator @@ -0,0 +1 @@ +Subproject commit 89b51be8588a19fcc9c93410707aeb5856dd8d8f diff --git a/charm-packages/proxy_native_relation_vnf/charms/simple_provides_proxy/src/charm.py b/charm-packages/proxy_native_relation_vnf/charms/simple_provides_proxy/src/charm.py new file mode 100755 index 0000000000000000000000000000000000000000..1092fc34023c21e26eeb7f5cb81876c9d5b21c44 --- /dev/null +++ b/charm-packages/proxy_native_relation_vnf/charms/simple_provides_proxy/src/charm.py @@ -0,0 +1,73 @@ +#!/usr/bin/env python3 +## +# Copyright 2020 Canonical Ltd. +# All rights reserved. +# +# 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 sys + +sys.path.append("lib") + +from charms.osm.sshproxy import SSHProxyCharm +from ops.main import main + +class MySSHProxyCharm(SSHProxyCharm): + + def __init__(self, framework, key): + super().__init__(framework, key) + + # Listen to charm events + self.framework.observe(self.on.config_changed, self.on_config_changed) + self.framework.observe(self.on.install, self.on_install) + self.framework.observe(self.on.start, self.on_start) + + # Listen to the touch action event + self.framework.observe(self.on.touch_action, self.on_touch_action) + self.framework.observe( + self.on.interface_relation_changed, self.on_interface_relation_changed + ) + + def on_config_changed(self, event): + """Handle changes in configuration""" + super().on_config_changed(event) + + def on_install(self, event): + """Called when the charm is being installed""" + super().on_install(event) + + def on_start(self, event): + """Called when the charm is being started""" + super().on_start(event) + + def on_touch_action(self, event): + """Touch a file.""" + + if self.model.unit.is_leader(): + filename = event.params["filename"] + proxy = self.get_ssh_proxy() + stdout, stderr = proxy.run("touch {}".format(filename)) + event.set_results({"output": stdout}) + else: + event.fail("Unit is not leader") + return + + def on_interface_relation_changed(self, event): + parameter = "Hello" + event.relation.data[self.model.unit]["parameter"] = parameter + self.model.unit.status = ActiveStatus("Parameter sent: {}".format(parameter)) + + +if __name__ == "__main__": + main(MySSHProxyCharm) diff --git a/charm-packages/proxy_native_relation_vnf/charms/simple_requires/actions.yaml b/charm-packages/proxy_native_relation_vnf/charms/simple_requires/actions.yaml new file mode 100644 index 0000000000000000000000000000000000000000..53a706b4eba7347764c4711b7077146e72241de4 --- /dev/null +++ b/charm-packages/proxy_native_relation_vnf/charms/simple_requires/actions.yaml @@ -0,0 +1,25 @@ +## +# Copyright 2020 Canonical Ltd. +# All rights reserved. +# +# 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. +## +touch: + description: "Touch a file on the VNF." + params: + filename: + description: "The name of the file to touch." + type: string + default: "" + required: + - filename diff --git a/charm-packages/proxy_native_relation_vnf/charms/simple_requires/config.yaml b/charm-packages/proxy_native_relation_vnf/charms/simple_requires/config.yaml new file mode 100644 index 0000000000000000000000000000000000000000..2be62318c6ce27156e4af585494b36d0c2b802f8 --- /dev/null +++ b/charm-packages/proxy_native_relation_vnf/charms/simple_requires/config.yaml @@ -0,0 +1,17 @@ +## +# Copyright 2020 Canonical Ltd. +# All rights reserved. +# +# 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. +## +options: {} \ No newline at end of file diff --git a/charm-packages/proxy_native_relation_vnf/charms/simple_requires/hooks/install b/charm-packages/proxy_native_relation_vnf/charms/simple_requires/hooks/install new file mode 100755 index 0000000000000000000000000000000000000000..c243dc90a31ba2fb5c14143a5d658f7b8dfd2dcc --- /dev/null +++ b/charm-packages/proxy_native_relation_vnf/charms/simple_requires/hooks/install @@ -0,0 +1,80 @@ +#!/usr/bin/env python3 +## +# Copyright 2020 Canonical Ltd. +# All rights reserved. +# +# 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 sys +import subprocess +import logging + +sys.path.append("lib") + +from ops.charm import CharmBase +from ops.main import main +from ops.model import ActiveStatus + +logger = logging.getLogger(__name__) + +class MyNativeCharm(CharmBase): + + def __init__(self, framework, key): + super().__init__(framework, key) + + # Listen to charm events + self.framework.observe(self.on.config_changed, self.on_config_changed) + self.framework.observe(self.on.install, self.on_install) + self.framework.observe(self.on.start, self.on_start) + + # Listen to the touch action event + self.framework.observe(self.on.touch_action, self.on_touch_action) + + # Listen to relation changed + self.framework.observe( + self.on.interface_relation_changed, self.on_interface_relation_changed + ) + def on_config_changed(self, event): + """Handle changes in configuration""" + self.model.unit.status = ActiveStatus() + + def on_install(self, event): + """Called when the charm is being installed""" + self.model.unit.status = ActiveStatus() + + def on_start(self, event): + """Called when the charm is being started""" + self.model.unit.status = ActiveStatus() + + def on_touch_action(self, event): + """Touch a file.""" + + filename = event.params["filename"] + try: + subprocess.run(["touch", filename], check=True) + event.set_results({"created": True, "filename": filename}) + except subprocess.CalledProcessError as e: + event.fail("Action failed: {}".format(e)) + self.model.unit.status = ActiveStatus() + + def on_interface_relation_changed(self, event): + logger.debug("RELATION DATA: {}".format(dict(event.relation.data[event.unit]))) + parameter = event.relation.data[event.unit].get("parameter") + if parameter: + self.model.unit.status = ActiveStatus("Parameter received: {}".format(parameter)) + + +if __name__ == "__main__": + main(MyNativeCharm) + diff --git a/charm-packages/proxy_native_relation_vnf/charms/simple_requires/hooks/start b/charm-packages/proxy_native_relation_vnf/charms/simple_requires/hooks/start new file mode 100755 index 0000000000000000000000000000000000000000..c243dc90a31ba2fb5c14143a5d658f7b8dfd2dcc --- /dev/null +++ b/charm-packages/proxy_native_relation_vnf/charms/simple_requires/hooks/start @@ -0,0 +1,80 @@ +#!/usr/bin/env python3 +## +# Copyright 2020 Canonical Ltd. +# All rights reserved. +# +# 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 sys +import subprocess +import logging + +sys.path.append("lib") + +from ops.charm import CharmBase +from ops.main import main +from ops.model import ActiveStatus + +logger = logging.getLogger(__name__) + +class MyNativeCharm(CharmBase): + + def __init__(self, framework, key): + super().__init__(framework, key) + + # Listen to charm events + self.framework.observe(self.on.config_changed, self.on_config_changed) + self.framework.observe(self.on.install, self.on_install) + self.framework.observe(self.on.start, self.on_start) + + # Listen to the touch action event + self.framework.observe(self.on.touch_action, self.on_touch_action) + + # Listen to relation changed + self.framework.observe( + self.on.interface_relation_changed, self.on_interface_relation_changed + ) + def on_config_changed(self, event): + """Handle changes in configuration""" + self.model.unit.status = ActiveStatus() + + def on_install(self, event): + """Called when the charm is being installed""" + self.model.unit.status = ActiveStatus() + + def on_start(self, event): + """Called when the charm is being started""" + self.model.unit.status = ActiveStatus() + + def on_touch_action(self, event): + """Touch a file.""" + + filename = event.params["filename"] + try: + subprocess.run(["touch", filename], check=True) + event.set_results({"created": True, "filename": filename}) + except subprocess.CalledProcessError as e: + event.fail("Action failed: {}".format(e)) + self.model.unit.status = ActiveStatus() + + def on_interface_relation_changed(self, event): + logger.debug("RELATION DATA: {}".format(dict(event.relation.data[event.unit]))) + parameter = event.relation.data[event.unit].get("parameter") + if parameter: + self.model.unit.status = ActiveStatus("Parameter received: {}".format(parameter)) + + +if __name__ == "__main__": + main(MyNativeCharm) + diff --git a/charm-packages/proxy_native_relation_vnf/charms/simple_requires/hooks/upgrade-charm b/charm-packages/proxy_native_relation_vnf/charms/simple_requires/hooks/upgrade-charm new file mode 100755 index 0000000000000000000000000000000000000000..c243dc90a31ba2fb5c14143a5d658f7b8dfd2dcc --- /dev/null +++ b/charm-packages/proxy_native_relation_vnf/charms/simple_requires/hooks/upgrade-charm @@ -0,0 +1,80 @@ +#!/usr/bin/env python3 +## +# Copyright 2020 Canonical Ltd. +# All rights reserved. +# +# 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 sys +import subprocess +import logging + +sys.path.append("lib") + +from ops.charm import CharmBase +from ops.main import main +from ops.model import ActiveStatus + +logger = logging.getLogger(__name__) + +class MyNativeCharm(CharmBase): + + def __init__(self, framework, key): + super().__init__(framework, key) + + # Listen to charm events + self.framework.observe(self.on.config_changed, self.on_config_changed) + self.framework.observe(self.on.install, self.on_install) + self.framework.observe(self.on.start, self.on_start) + + # Listen to the touch action event + self.framework.observe(self.on.touch_action, self.on_touch_action) + + # Listen to relation changed + self.framework.observe( + self.on.interface_relation_changed, self.on_interface_relation_changed + ) + def on_config_changed(self, event): + """Handle changes in configuration""" + self.model.unit.status = ActiveStatus() + + def on_install(self, event): + """Called when the charm is being installed""" + self.model.unit.status = ActiveStatus() + + def on_start(self, event): + """Called when the charm is being started""" + self.model.unit.status = ActiveStatus() + + def on_touch_action(self, event): + """Touch a file.""" + + filename = event.params["filename"] + try: + subprocess.run(["touch", filename], check=True) + event.set_results({"created": True, "filename": filename}) + except subprocess.CalledProcessError as e: + event.fail("Action failed: {}".format(e)) + self.model.unit.status = ActiveStatus() + + def on_interface_relation_changed(self, event): + logger.debug("RELATION DATA: {}".format(dict(event.relation.data[event.unit]))) + parameter = event.relation.data[event.unit].get("parameter") + if parameter: + self.model.unit.status = ActiveStatus("Parameter received: {}".format(parameter)) + + +if __name__ == "__main__": + main(MyNativeCharm) + diff --git a/charm-packages/proxy_native_relation_vnf/charms/simple_requires/lib/ops b/charm-packages/proxy_native_relation_vnf/charms/simple_requires/lib/ops new file mode 120000 index 0000000000000000000000000000000000000000..c36dab1ed4a93aee97a31b0eba0438852c5e05bf --- /dev/null +++ b/charm-packages/proxy_native_relation_vnf/charms/simple_requires/lib/ops @@ -0,0 +1 @@ +../mod/operator/ops/ \ No newline at end of file diff --git a/charm-packages/proxy_native_relation_vnf/charms/simple_requires/metadata.yaml b/charm-packages/proxy_native_relation_vnf/charms/simple_requires/metadata.yaml new file mode 100644 index 0000000000000000000000000000000000000000..071f8fa8d2b605f85a78f2322ba8c096c65e1326 --- /dev/null +++ b/charm-packages/proxy_native_relation_vnf/charms/simple_requires/metadata.yaml @@ -0,0 +1,28 @@ +## +# Copyright 2020 Canonical Ltd. +# All rights reserved. +# +# 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. +## + +name: simple-native-requires +summary: A simple native charm +description: | + Simple native charm +series: + - bionic + - xenial + - focal +requires: + interface: + interface: interface \ No newline at end of file diff --git a/charm-packages/proxy_native_relation_vnf/charms/simple_requires/mod/operator b/charm-packages/proxy_native_relation_vnf/charms/simple_requires/mod/operator new file mode 160000 index 0000000000000000000000000000000000000000..a84ce8776b368a8b2bccdb173716e342db9a6b36 --- /dev/null +++ b/charm-packages/proxy_native_relation_vnf/charms/simple_requires/mod/operator @@ -0,0 +1 @@ +Subproject commit a84ce8776b368a8b2bccdb173716e342db9a6b36 diff --git a/charm-packages/proxy_native_relation_vnf/charms/simple_requires/src/charm.py b/charm-packages/proxy_native_relation_vnf/charms/simple_requires/src/charm.py new file mode 100755 index 0000000000000000000000000000000000000000..c243dc90a31ba2fb5c14143a5d658f7b8dfd2dcc --- /dev/null +++ b/charm-packages/proxy_native_relation_vnf/charms/simple_requires/src/charm.py @@ -0,0 +1,80 @@ +#!/usr/bin/env python3 +## +# Copyright 2020 Canonical Ltd. +# All rights reserved. +# +# 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 sys +import subprocess +import logging + +sys.path.append("lib") + +from ops.charm import CharmBase +from ops.main import main +from ops.model import ActiveStatus + +logger = logging.getLogger(__name__) + +class MyNativeCharm(CharmBase): + + def __init__(self, framework, key): + super().__init__(framework, key) + + # Listen to charm events + self.framework.observe(self.on.config_changed, self.on_config_changed) + self.framework.observe(self.on.install, self.on_install) + self.framework.observe(self.on.start, self.on_start) + + # Listen to the touch action event + self.framework.observe(self.on.touch_action, self.on_touch_action) + + # Listen to relation changed + self.framework.observe( + self.on.interface_relation_changed, self.on_interface_relation_changed + ) + def on_config_changed(self, event): + """Handle changes in configuration""" + self.model.unit.status = ActiveStatus() + + def on_install(self, event): + """Called when the charm is being installed""" + self.model.unit.status = ActiveStatus() + + def on_start(self, event): + """Called when the charm is being started""" + self.model.unit.status = ActiveStatus() + + def on_touch_action(self, event): + """Touch a file.""" + + filename = event.params["filename"] + try: + subprocess.run(["touch", filename], check=True) + event.set_results({"created": True, "filename": filename}) + except subprocess.CalledProcessError as e: + event.fail("Action failed: {}".format(e)) + self.model.unit.status = ActiveStatus() + + def on_interface_relation_changed(self, event): + logger.debug("RELATION DATA: {}".format(dict(event.relation.data[event.unit]))) + parameter = event.relation.data[event.unit].get("parameter") + if parameter: + self.model.unit.status = ActiveStatus("Parameter received: {}".format(parameter)) + + +if __name__ == "__main__": + main(MyNativeCharm) + diff --git a/charm-packages/proxy_native_relation_vnf/cloud_init/cloud-config.txt b/charm-packages/proxy_native_relation_vnf/cloud_init/cloud-config.txt new file mode 100755 index 0000000000000000000000000000000000000000..36c8d1bf2cdebbc4e50d1e8348003f64f419cd0b --- /dev/null +++ b/charm-packages/proxy_native_relation_vnf/cloud_init/cloud-config.txt @@ -0,0 +1,12 @@ +#cloud-config +password: osm4u +chpasswd: { expire: False } +ssh_pwauth: True + +write_files: +- content: | + # My new helloworld file + + owner: root:root + permissions: '0644' + path: /root/helloworld.txt diff --git a/charm-packages/proxy_native_relation_vnf/icons/osm.png b/charm-packages/proxy_native_relation_vnf/icons/osm.png new file mode 100644 index 0000000000000000000000000000000000000000..62012d2a2b491bdcd536d62c3c3c863c0d8c1b33 Binary files /dev/null and b/charm-packages/proxy_native_relation_vnf/icons/osm.png differ diff --git a/charm-packages/proxy_native_relation_vnf/proxy_native_relation_vnfd.yaml b/charm-packages/proxy_native_relation_vnf/proxy_native_relation_vnfd.yaml new file mode 100644 index 0000000000000000000000000000000000000000..a9a6ec2171f3e1da79ed3d79f6f0357f3c444c71 --- /dev/null +++ b/charm-packages/proxy_native_relation_vnf/proxy_native_relation_vnfd.yaml @@ -0,0 +1,110 @@ +vnfd:vnfd-catalog: + vnfd: + - id: proxy_native_relation-vnf + name: proxy_native_relation-vnf + short-name: proxy_native_relation-vnf + version: 1.0 + description: A VNF consisting of 1 VDU connected to two external VL, and one for data and another one for management + logo: osm.png + connection-point: + - id: requires-mgmt + name: requires-mgmt + short-name: requires-mgmt + type: VPORT + - id: provides-mgmt + name: provides-mgmt + short-name: provides-mgmt + type: VPORT + mgmt-interface: + cp: provides-mgmt + vdu: + - id: simple_requires + name: simple_requires + image: ubuntu18.04 + count: 1 + vm-flavor: + vcpu-count: 1 + memory-mb: 1024 + storage-gb: 10 + interface: + - name: simple_requires-eth0 + position: 1 + type: EXTERNAL + virtual-interface: + type: PARAVIRT + external-connection-point-ref: requires-mgmt + mgmt-interface: true + cloud-init-file: cloud-config.txt + vdu-configuration: + juju: + charm: simple_requires + proxy: false + config-access: + ssh-access: + required: True + default-user: ubuntu + initial-config-primitive: + - seq: 1 + name: touch + parameter: + - name: filename + data-type: STRING + value: '/home/ubuntu/first-touch' + config-primitive: + - name: touch + parameter: + - name: filename + data-type: STRING + default-value: '/home/ubuntu/touched' + - id: simple_provides + name: simple_provides + image: ubuntu18.04 + count: 1 + vm-flavor: + vcpu-count: 1 + memory-mb: 1024 + storage-gb: 10 + interface: + - name: simple_provides-eth0 + position: 1 + type: EXTERNAL + virtual-interface: + type: PARAVIRT + external-connection-point-ref: provides-mgmt + mgmt-interface: true + cloud-init-file: cloud-config.txt + vnf-configuration: + juju: + charm: simple_provides_proxy + proxy: true + config-access: + ssh-access: + required: True + default-user: ubuntu + initial-config-primitive: + - seq: 1 + name: config + parameter: + - name: ssh-hostname + value: + - name: ssh-username + value: ubuntu + - seq: 2 + name: touch + parameter: + - name: filename + data-type: STRING + value: '/home/ubuntu/first-touch' + config-primitive: + - name: touch + parameter: + - name: filename + data-type: STRING + default-value: '/home/ubuntu/touched' + relation: + - name: relation + entities: + - id: proxy_native_relation-vnf + endpoint: interface + - id: simple_requires + endpoint: interface \ No newline at end of file