Commit c79a4c8a authored by garciadav's avatar garciadav
Browse files

wip: add ns-level relation

parent 4a490d4a
Pipeline #2718 failed with stage
in 29 seconds
# Copyright 2020 David Garcia
# See LICENSE file for licensing details.
#
# This is only an example, and you should edit to suit your needs.
# If you don't need actions, you can remove the file entirely.
# It ties in to the example _on_fortune_action handler in src/charm.py
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."
# 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.
#
# For those usages not covered by the Apache License, Version 2.0 please
# contact: legal@canonical.com
#
# To get in touch with the maintainers, please contact:
# osm-charmers@lists.launchpad.net
##
type: charm
bases:
- build-on:
- name: ubuntu
channel: "20.04"
architectures: ["amd64"]
run-on:
- name: ubuntu
channel: "20.04"
architectures: [amd64]
parts:
charm:
build-packages: [git]
# Copyright 2020 David Garcia
# See LICENSE file for licensing details.
#
# This is only an example, and you should edit to suit your needs.
# If you don't need config, you can remove the file entirely.
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-private-key:
# type: string
# default: ""
# description: "DEPRECATED. The private ssh key to be 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."
apt-mirror:
type: string
description: "Apt mirror. Only used for K8s proxy charms with Juju version lower than 2.9.4"
security-apt-mirror:
type: string
description: "Security Apt mirror. Only used for K8s proxy charms with Juju version lower than 2.9.4"
# Copyright 2020 David Garcia
# See LICENSE file for licensing details.
name: sshproxy
description: |
This is a basic example of an SSHProxy Charm for OSM
summary: |
This charm should be used as a base for any Proxy Charm (SSH based)
series:
# - focal
# - bionic
# - xenial
- kubernetes
deployment:
mode: operator
peers:
proxypeer:
interface: proxypeer
provides:
interface:
interface: interface
tags:
- osm
- proxycharm
- ssh
ops
packaging
git+https://github.com/charmed-osm/charms.osm#egg=charms.osm
#!/bin/sh -e
# Copyright 2020 David Garcia
# See LICENSE file for licensing details.
if [ -z "$VIRTUAL_ENV" -a -d venv/ ]; then
. venv/bin/activate
fi
if [ -z "$PYTHONPATH" ]; then
export PYTHONPATH=src
else
export PYTHONPATH="src:$PYTHONPATH"
fi
flake8
python3 -m unittest -v "$@"
#!/usr/bin/env python3
# Copyright 2020 David Garcia
# See LICENSE file for licensing details.
from ops.main import main
from charms.osm.sshproxy import SSHProxyCharm
from ops.model import (
ActiveStatus,
MaintenanceStatus,
)
class SshproxyCharm(SSHProxyCharm):
def __init__(self, *args):
super().__init__(*args)
# An example of setting charm state
# that's persistent across events
self.state.set_default(is_started=False)
if not self.state.is_started:
self.state.is_started = True
# Register all of the events we want to observe
# 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)
self.framework.observe(self.on.upgrade_charm, self.on_upgrade_charm)
# Charm actions (primitives)
self.framework.observe(self.on.touch_action, self.on_touch_action)
# OSM actions (primitives)
self.framework.observe(self.on.start_action, self.on_start_action)
self.framework.observe(self.on.stop_action, self.on_stop_action)
self.framework.observe(self.on.restart_action, self.on_restart_action)
self.framework.observe(self.on.reboot_action, self.on_reboot_action)
self.framework.observe(self.on.upgrade_action, self.on_upgrade_action)
def on_config_changed(self, event):
"""Handle changes in configuration"""
super().on_config_changed(event)
def on_install(self, event):
super().on_install(event)
def on_start(self, event):
"""Called when the charm is being installed"""
super().on_start(event)
def on_upgrade_charm(self, event):
"""Upgrade the charm."""
self.unit.status = MaintenanceStatus("Upgrading charm")
# Do upgrade related stuff
self.unit.status = ActiveStatus("Active")
def on_touch_action(self, event):
"""Touch a file."""
if self.unit.is_leader():
filename = event.params["filename"]
proxy = self.get_ssh_proxy()
stdout, stderr = proxy.run("touch {}".format(filename))
proxy.scp("/etc/lsb-release", "/home/ubuntu/scp_file")
event.set_results({"output": stdout})
else:
event.fail("Unit is not leader")
return
###############
# OSM methods #
###############
def on_start_action(self, event):
"""Start the VNF service on the VM."""
pass
def on_stop_action(self, event):
"""Stop the VNF service on the VM."""
pass
def on_restart_action(self, event):
"""Restart the VNF service on the VM."""
pass
def on_reboot_action(self, event):
"""Reboot the VM."""
if self.unit.is_leader():
proxy = self.get_ssh_proxy()
stdout, stderr = proxy.run("sudo reboot")
if len(stderr):
event.fail(stderr)
else:
event.fail("Unit is not leader")
return
def on_upgrade_action(self, event):
"""Upgrade the VNF service on the VM."""
pass
if __name__ == "__main__":
main(SshproxyCharm)
# Copyright 2020 David Garcia
# See LICENSE file for licensing details.
import unittest
from unittest.mock import Mock, call
from ops.testing import Harness
from charm import SshproxyCharm
class TestCharm(unittest.TestCase):
@unittest.mock.patch("charms.osm.sshproxy.SSHProxy.run")
def test_touch_action(self, mock_ssh_proxy):
mock_ssh_proxy.return_value = ("stdout", None)
harness = Harness(SshproxyCharm)
harness.set_leader(is_leader=True)
harness.begin()
action_event = Mock(params={"filename": "/home/ubuntu/asd"})
harness.charm.on_touch_action(action_event)
self.assertTrue(action_event.set_results.called)
self.assertEqual(
action_event.set_results.call_args,
call({"output": "stdout"}),
)
def test_touch_action_fail(self):
harness = Harness(SshproxyCharm)
harness.set_leader(is_leader=False)
harness.begin()
action_event = Mock(params={"filename": "/home/ubuntu/asd"})
harness.charm.on_touch_action(action_event)
self.assertEqual(action_event.fail.call_args, [("Unit is not leader",)])
#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
vnfd:
description:
A VNF consisting of 1 VDU connected to two external VL, and one for
data and another one for management
df:
- id: default-df
instantiation-level:
- id: default-instantiation-level
vdu-level:
- number-of-instances: 1
vdu-id: simple_requires
- number-of-instances: 1
vdu-id: simple_provides
vdu-profile:
- id: simple_requires
min-number-of-instances: 1
- id: simple_provides
min-number-of-instances: 1
lcm-operations-configuration:
operate-vnf-op-config:
day1-2:
- id: cross_model_no_relation-vnf
config-access:
ssh-access:
default-user: ubuntu
required: true
execution-environment-list:
- id: simple-provides-proxy-ee
juju:
charm: sshproxy.charm
proxy: true
cloud: k8s
external-connection-point-ref: provides-mgmt-ext
initial-config-primitive:
- seq: 1
name: config
execution-environment-ref: simple-provides-proxy-ee
parameter:
- name: ssh-hostname
value: <rw_mgmt_ip>
- name: ssh-username
value: ubuntu
- seq: 2
name: touch
execution-environment-ref: simple-provides-proxy-ee
parameter:
- data-type: STRING
name: filename
value: /home/ubuntu/first-touch
config-primitive:
- name: touch
execution-environment-ref: simple-provides-proxy-ee
parameter:
- data-type: STRING
default-value: /home/ubuntu/touched
name: filename
- id: simple_requires
config-access:
ssh-access:
default-user: ubuntu
required: true
execution-environment-list:
- id: simple-requires-ee
juju:
charm: simple-requires.charm
proxy: false
external-connection-point-ref: requires-mgmt-ext
initial-config-primitive:
- seq: 1
name: touch
execution-environment-ref: simple-requires-ee
parameter:
- data-type: STRING
name: filename
value: /home/ubuntu/first-touch
config-primitive:
- name: touch
execution-environment-ref: simple-requires-ee
parameter:
- data-type: STRING
default-value: /home/ubuntu/touched
name: filename
ext-cpd:
- id: requires-mgmt-ext
int-cpd:
cpd: simple_requires-eth0-int
vdu-id: simple_requires
- id: provides-mgmt-ext
int-cpd:
cpd: simple_provides-eth0-int
vdu-id: simple_provides
id: cross_model_no_relation-vnf
mgmt-cp: provides-mgmt-ext
product-name: cross_model_no_relation-vnf
sw-image-desc:
- id: ubuntu18.04
image: ubuntu18.04
name: ubuntu18.04
kdu:
- name: native-kdu
juju-bundle: bundle.yaml
vdu:
- cloud-init-file: cloud-config.txt
id: simple_requires
int-cpd:
- id: simple_requires-eth0-int
virtual-network-interface-requirement:
- name: simple_requires-eth0
position: 1
virtual-interface:
type: PARAVIRT
name: simple_requires
sw-image-desc: ubuntu18.04
virtual-compute-desc: simple_requires-compute
virtual-storage-desc:
- simple_requires-storage
- cloud-init-file: cloud-config.txt
id: simple_provides
int-cpd:
- id: simple_provides-eth0-int
virtual-network-interface-requirement:
- name: simple_provides-eth0
position: 1
virtual-interface:
type: PARAVIRT
name: simple_provides
sw-image-desc: ubuntu18.04
virtual-compute-desc: simple_provides-compute
virtual-storage-desc:
- simple_provides-storage
version: 1.0
virtual-compute-desc:
- id: simple_requires-compute
virtual-cpu:
num-virtual-cpu: 1
virtual-memory:
size: 1.0
- id: simple_provides-compute
virtual-cpu:
num-virtual-cpu: 1
virtual-memory:
size: 1.0
virtual-storage-desc:
- id: simple_requires-storage
size-of-storage: 10
- id: simple_provides-storage
size-of-storage: 10
description: Squid Bundle
bundle: kubernetes
applications:
nginx:
charm: './charms/nginx.charm'
scale: 1
# 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.
#
# For those usages not covered by the Apache License, Version 2.0 please
# contact: legal@canonical.com
#
# To get in touch with the maintainers, please contact:
# osm-charmers@lists.launchpad.net
##
type: charm
bases:
- build-on:
- name: ubuntu
channel: "20.04"
architectures: ["amd64"]
run-on:
- name: ubuntu
channel: "20.04"
architectures: [amd64]
parts:
charm:
build-packages: [git]
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment