Skip to content
Snippets Groups Projects
Commit 889e8bb2 authored by garciadav's avatar garciadav Committed by Mark Beierl
Browse files

Fix bugs in NG-UI charm


Change-Id: I0a17b6f1fb869cadfb9f35e14b5d64f9e9ffd3c9
Signed-off-by: default avatarDavid Garcia <david.garcia@canonical.com>
parent dfd42887
No related branches found
No related tags found
No related merge requests found
......@@ -29,25 +29,25 @@ applications:
annotations:
gui-x: 0
gui-y: 1100
mariadb-k8s:
charm: 'cs:~charmed-osm/mariadb-k8s'
channel: 'stable'
scale: 1
series: kubernetes
storage:
database: 50M
options:
password: manopw
root_password: osm4u
user: mano
database: database
mysql_port: "3306"
query-cache-type: "OFF"
query-cache-size: 0
ha-mode: false
annotations:
gui-x: -500
gui-y: -400
# mariadb-k8s:
# charm: 'cs:~charmed-osm/mariadb-k8s'
# channel: 'stable'
# scale: 1
# series: kubernetes
# storage:
# database: 50M
# options:
# password: manopw
# root_password: osm4u
# user: mano
# database: database
# mysql_port: "3306"
# query-cache-type: "OFF"
# query-cache-size: 0
# ha-mode: false
# annotations:
# gui-x: -500
# gui-y: -400
kafka-k8s:
charm: 'cs:~charmed-osm/kafka-k8s'
channel: 'stable'
......@@ -118,6 +118,15 @@ applications:
annotations:
gui-x: 500
gui-y: -400
ng-ui:
charm: '%(prefix)s/ng-ui%(suffix)s'
channel: '%(channel)s'
scale: 1
series: kubernetes
options:
port: 80
server_name: localhost
client_max_body_size: 15M
lcm-k8s:
charm: '%(prefix)s/lcm-k8s%(suffix)s'
channel: '%(channel)s'
......
......@@ -11,4 +11,39 @@
# 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. -->
# NG-UI Charm
\ No newline at end of file
# NG-UI Charm
## How to deploy
```bash
juju deploy . # cs:~charmed-osm/ng-ui --channel edge
juju relate ng-ui nbi-k8s
```
## How to scale
```bash
juju scale-application ng-ui 3
```
## How to use certificates
Generate your own certificate if you don't have one already:
```bash
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ssl_certificate.key -out ssl_certificate.crt
sudo chown $USER:$USER ssl_certificate.key
juju attach-resource ng-ui ssl_certificate=ssl_certificate.crt
juju attach-resource ng-ui ssl_certificate_key=ssl_certificate.key
juju config ng-ui port 443
```
## Config Examples
```bash
juju config ng-ui image=opensourcemano/ng-ui:<tag>
juju config ng-ui port=80
juju config server_name=<name>
juju config client_max_body_size=25M
```
......@@ -31,12 +31,4 @@ options:
client_max_body_size:
description: Client maximum body size
type: string
default: 15M
nbi_hostname:
description: NBI hostname
type: string
default: nbi-k8s
nbi_port:
description: NBI Port
type: int
default: 9999
default: 15M
\ No newline at end of file
......@@ -19,9 +19,12 @@ server {
root /usr/share/nginx/html;
index index.html index.htm;
client_max_body_size $client_max_body_size;
$ssl_crt
$ssl_crt_key
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
location /osm {
proxy_pass http://$nbi_hostname:$nbi_port;
proxy_pass https://$nbi_host:$nbi_port;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_set_header Accept-Encoding "";
}
......
......@@ -11,6 +11,7 @@
# 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: ng-ui
summary: A Next Generation UI charm for Opensource MANO
description: |
......@@ -21,6 +22,13 @@ min-juju-version: 2.7.0
deployment:
type: stateless
service: cluster
provides:
requires:
nbi:
interface: osm-nbi
resources:
ssl_certificate:
type: file
filename: ssl_certificate.crt
ssl_certificate_key:
type: file
filename: ssl_certificate.key
\ No newline at end of file
......@@ -24,6 +24,8 @@ from ops.main import main
from ops.model import (
ActiveStatus,
MaintenanceStatus,
BlockedStatus,
ModelError,
)
from glob import glob
......@@ -39,24 +41,40 @@ class NGUICharm(CharmBase):
def __init__(self, framework, key):
super().__init__(framework, key)
self.state.set_default(spec=None)
self.state.set_default(nbi_host=None)
self.state.set_default(nbi_port=None)
# Observe Charm related events
self.framework.observe(self.on.config_changed, self.on_config_changed)
self.framework.observe(self.on.start, self.on_start)
self.framework.observe(self.on.upgrade_charm, self.on_upgrade_charm)
# self.framework.observe(
# self.on.nbi_relation_joined, self.on_nbi_relation_joined
# )
self.framework.observe(
self.on.nbi_relation_changed, self.on_nbi_relation_changed
)
# SSL Certificate path
self.ssl_folder = "/certs"
self.ssl_crt = "{}/ssl_certificate.crt".format(self.ssl_folder)
self.ssl_key = "{}/ssl_certificate.key".format(self.ssl_folder)
def _apply_spec(self):
# Only apply the spec if this unit is a leader.
if not self.framework.model.unit.is_leader():
unit = self.model.unit
if not unit.is_leader():
unit.status = ActiveStatus("Ready")
return
if not self.state.nbi_host or not self.state.nbi_port:
unit.status = MaintenanceStatus("Waiting for NBI")
return
unit.status = MaintenanceStatus("Applying new pod spec")
new_spec = self.make_pod_spec()
if new_spec == self.state.spec:
unit.status = ActiveStatus("Ready")
return
self.framework.model.pod.set_spec(new_spec)
self.state.spec = new_spec
unit.status = ActiveStatus("Ready")
def make_pod_spec(self):
config = self.framework.model.config
......@@ -78,14 +96,30 @@ class NGUICharm(CharmBase):
"initialDelaySeconds": 45,
},
}
ssl_certificate = None
ssl_certificate_key = None
try:
ssl_certificate = self.model.resources.fetch("ssl_certificate")
ssl_certificate_key = self.model.resources.fetch("ssl_certificate_key")
except ModelError as e:
logger.info(e)
config_spec = {
"port": config["port"],
"server_name": config["server_name"],
"client_max_body_size": config["client_max_body_size"],
"nbi_hostname": config["nbi_hostname"],
"nbi_port": config["nbi_port"],
"nbi_host": self.state.nbi_host or config["nbi_host"],
"nbi_port": self.state.nbi_port or config["nbi_port"],
"ssl_crt": "",
"ssl_crt_key": "",
}
if ssl_certificate and ssl_certificate_key:
config_spec["ssl_crt"] = "ssl_certificate {};".format(self.ssl_crt)
config_spec["ssl_crt_key"] = "ssl_certificate_key {};".format(self.ssl_key)
config_spec["port"] = "{} ssl".format(config_spec["port"])
files = [
{
"name": "configuration",
......@@ -96,8 +130,22 @@ class NGUICharm(CharmBase):
.substitute(config_spec)
for filename in glob("files/*")
},
},
}
]
if ssl_certificate and ssl_certificate_key:
files.append(
{
"name": "ssl",
"mountPath": self.ssl_folder,
"files": {
Path(filename)
.name: Template(Path(filename).read_text())
.substitute(config_spec)
for filename in [ssl_certificate, ssl_certificate_key]
},
}
)
logger.debug(files)
spec = {
"version": 2,
......@@ -116,17 +164,11 @@ class NGUICharm(CharmBase):
def on_config_changed(self, event):
"""Handle changes in configuration"""
unit = self.model.unit
unit.status = MaintenanceStatus("Applying new pod spec")
self._apply_spec()
unit.status = ActiveStatus("Ready")
def on_start(self, event):
"""Called when the charm is being installed"""
unit = self.model.unit
unit.status = MaintenanceStatus("Applying pod spec")
self._apply_spec()
unit.status = ActiveStatus("Ready")
def on_upgrade_charm(self, event):
"""Upgrade the charm."""
......@@ -134,14 +176,20 @@ class NGUICharm(CharmBase):
unit.status = MaintenanceStatus("Upgrading charm")
self.on_start(event)
# def on_nbi_relation_joined(self, event):
# unit = self.model.unit
# if not unit.is_leader():
# return
# config = self.framework.model.config
# unit = MaintenanceStatus("Sending connection data")
def on_nbi_relation_changed(self, event):
unit = self.model.unit
if not unit.is_leader():
return
self.state.nbi_host = event.relation.data[event.unit].get("host")
self.state.nbi_port = event.relation.data[event.unit].get("port")
self._apply_spec()
def resource_get(self, resource_name: str) -> Path:
from pathlib import Path
from subprocess import run
# unit = ActiveStatus("Ready")
result = run(["resource-get", resource_name], output=True, text=True)
return Path(result.stdout.strip())
if __name__ == "__main__":
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment