From d96771914eef59382f9c053178338cd6e2c2a7a7 Mon Sep 17 00:00:00 2001 From: xinhuili Date: Thu, 27 Jun 2019 21:34:03 -0700 Subject: [PATCH] This patch is to commit into charts These charts are used to install seba Signed-off-by: XINHUI LI Change-Id: I1696abf492f016086939bb6b05bd8038d4603179 --- helm-charts/README.md | 19 + helm-charts/VERSION | 1 + helm-charts/abstract-olt/.helmignore | 21 + helm-charts/abstract-olt/Chart.yaml | 21 + helm-charts/abstract-olt/templates/_helpers.tpl | 48 + helm-charts/abstract-olt/templates/deployment.yaml | 59 + helm-charts/abstract-olt/values.yaml | 42 + helm-charts/bbsim/Chart.yaml | 20 + helm-charts/bbsim/templates/NOTES.txt | 5 + helm-charts/bbsim/templates/_helpers.tpl | 48 + helm-charts/bbsim/templates/deployment.yaml | 84 + helm-charts/bbsim/templates/service.yaml | 34 + helm-charts/bbsim/templates/tests/test-bbsim.yaml | 41 + helm-charts/bbsim/values.yaml | 70 + helm-charts/configs/onos-debug.yaml | 23 + helm-charts/configs/seba-ponsim-latest.yaml | 127 + helm-charts/configs/seba-ponsim-voltha-1.6.yaml | 48 + helm-charts/configs/seba-ponsim.yaml | 41 + helm-charts/configs/siab-v1.0.0.yaml | 27 + helm-charts/dhcp-server/Chart.yaml | 17 + helm-charts/dhcp-server/templates/_helpers.tpl | 25 + helm-charts/dhcp-server/templates/configmap.yaml | 22 + helm-charts/dhcp-server/templates/deployment.yaml | 48 + .../dhcp-server/templates/dhcp-service.yaml | 29 + helm-charts/dhcp-server/values.yaml | 34 + helm-charts/etcd-cluster/.helmignore | 21 + helm-charts/etcd-cluster/Chart.yaml | 19 + .../templates/etcd-cluster-service.yaml | 30 + .../etcd-cluster/templates/etcd-cluster.yaml | 30 + helm-charts/etcd-cluster/values.yaml | 37 + helm-charts/examples/add-trap-flow.json | 30 + helm-charts/examples/add-trap-flow.sh | 20 + helm-charts/examples/adminuser-values.yaml | 49 + helm-charts/examples/api-test-images.yaml | 37 + helm-charts/examples/api-test-values.yaml | 27 + helm-charts/examples/bbsim-16.yaml | 430 + helm-charts/examples/bbsim-dhcp.yaml | 58 + helm-charts/examples/compute-nodes.yaml | 33 + helm-charts/examples/fabric-values.yaml | 43 + helm-charts/examples/filter-images.yaml | 67 + helm-charts/examples/image-tag-candidate.yaml | 124 + .../examples/imagePullPolicy-IfNotPresent.yaml | 130 + helm-charts/examples/kafka-production.yaml | 53 + helm-charts/examples/kafka-single.yaml | 48 + helm-charts/examples/logging-single.yaml | 37 + helm-charts/examples/mcord-images.yaml | 32 + helm-charts/examples/onos-nodeport-values.yaml | 32 + .../examples/openstack-dev-master-node.yaml | 25 + helm-charts/examples/openstack-instance-tosca.yaml | 92 + helm-charts/examples/registry-cephfs.yaml | 33 + .../examples/sample-rcord-subscriber-tosca.yaml | 79 + helm-charts/examples/xos-db-ceph-rbd.yaml | 20 + helm-charts/examples/xos-db-local-dir.yaml | 20 + helm-charts/examples/xossh-candidate.yaml | 19 + helm-charts/helm-charts-org | 1 + helm-charts/logging/.helmignore | 21 + helm-charts/logging/Chart.yaml | 18 + helm-charts/logging/README.md | 22 + helm-charts/logging/requirements.yaml | 35 + helm-charts/logging/templates/NOTES.txt | 16 + helm-charts/logging/values.yaml | 144 + helm-charts/mavenrepo/Chart.yaml | 20 + helm-charts/mavenrepo/templates/_helpers.tpl | 36 + helm-charts/mavenrepo/templates/deployment.yaml | 36 + helm-charts/mavenrepo/templates/repo-service.yaml | 33 + helm-charts/mavenrepo/values.yaml | 27 + .../mcord-release/Dockerfile.sriovds/Dockerfile | 43 + .../mcord-release/assets/mcord-architecture.png | Bin 0 -> 285399 bytes .../mcord-release/mcord-services/.helmignore | 21 + .../mcord-release/mcord-services/Chart.yaml | 21 + .../mcord-services/templates/NOTES.txt | 32 + .../mcord-services/templates/_helpers.tpl | 49 + .../mcord-services/templates/hss.yaml | 284 + .../mcord-services/templates/hssdb.yaml | 109 + .../mcord-services/templates/mme.yaml | 293 + .../mcord-services/templates/networks.yaml | 41 + .../mcord-services/templates/spgwc.yaml | 530 + .../mcord-services/templates/spgwu.yaml | 169 + .../mcord-release/mcord-services/values.yaml | 82 + helm-charts/mcord-release/mcord-setup/.helmignore | 21 + helm-charts/mcord-release/mcord-setup/Chart.yaml | 21 + .../mcord-release/mcord-setup/templates/NOTES.txt | 33 + .../mcord-setup/templates/_helpers.tpl | 49 + .../mcord-setup/templates/multus-sriov-ds.yaml | 234 + .../mcord-setup/templates/sriov-conf.yaml | 34 + helm-charts/mcord-release/mcord-setup/values.yaml | 24 + .../mcord/cni-config/01-cni-service-account.yaml | 68 + helm-charts/mcord/cni-config/02-network-crd.yaml | 38 + .../mcord/cni-config/03-network-definition.yaml | 69 + .../04-sriov-device-plugin-configmap.yaml | 92 + .../mcord/cni-config/05-sriov-device-plugin.yaml | 112 + helm-charts/mcord/mcord-bbu/.helmignore | 21 + helm-charts/mcord/mcord-bbu/Chart.yaml | 21 + helm-charts/mcord/mcord-bbu/templates/_helpers.tpl | 48 + .../mcord/mcord-bbu/templates/accelleran.yaml | 163 + helm-charts/mcord/mcord-bbu/templates/cm.yaml | 25 + helm-charts/mcord/mcord-bbu/values.yaml | 48 + helm-charts/mcord/mcord-cdn-local-free/Chart.yaml | 20 + .../mcord/mcord-cdn-local-free/templates/cm.yaml | 107 + .../mcord-cdn-local-free/templates/nginx.yaml | 130 + helm-charts/mcord/mcord-cdn-local-free/values.yaml | 46 + helm-charts/mcord/mcord-cdn-local/Chart.yaml | 21 + .../mcord/mcord-cdn-local/templates/cm.yaml | 171 + .../mcord/mcord-cdn-local/templates/nginx.yaml | 107 + helm-charts/mcord/mcord-cdn-local/values.yaml | 32 + helm-charts/mcord/mcord-cdn-remote-free/Chart.yaml | 20 + .../templates/remote-streaming.yaml | 75 + .../mcord/mcord-cdn-remote-free/values.yaml | 33 + helm-charts/mcord/mcord-cdn-remote/Chart.yaml | 21 + .../mcord/mcord-cdn-remote/templates/cm.yaml | 24 + .../mcord-cdn-remote/templates/namespace.yaml | 23 + .../mcord-cdn-remote/templates/remote-vlc.yaml | 74 + .../mcord/mcord-cdn-remote/templates/wowza.yaml | 119 + helm-charts/mcord/mcord-cdn-remote/values.yaml | 41 + helm-charts/mcord/mcord-control-plane/Chart.yaml | 21 + .../mcord-control-plane/templates/_helpers.tpl | 48 + .../mcord-control-plane/templates/cassandra.yaml | 88 + .../mcord/mcord-control-plane/templates/cm.yaml | 886 + .../mcord/mcord-control-plane/templates/cp.yaml | 133 + .../mcord/mcord-control-plane/templates/hss.yaml | 93 + .../mcord/mcord-control-plane/templates/mme.yaml | 121 + helm-charts/mcord/mcord-control-plane/values.yaml | 88 + helm-charts/mcord/mcord-data-plane/.helmignore | 21 + helm-charts/mcord/mcord-data-plane/Chart.yaml | 21 + .../mcord/mcord-data-plane/templates/_helpers.tpl | 48 + .../mcord/mcord-data-plane/templates/cm.yaml | 438 + .../mcord/mcord-data-plane/templates/dp.yaml | 155 + helm-charts/mcord/mcord-data-plane/values.yaml | 46 + helm-charts/mininet/.helmignore | 21 + helm-charts/mininet/Chart.yaml | 20 + helm-charts/mininet/templates/_helpers.tpl | 48 + helm-charts/mininet/templates/configmap.yaml | 21 + helm-charts/mininet/templates/deployment.yaml | 71 + helm-charts/mininet/toposcripts/topo.py | 64 + helm-charts/mininet/values.yaml | 52 + helm-charts/nem-monitoring/.helmignore | 21 + helm-charts/nem-monitoring/Chart.yaml | 18 + helm-charts/nem-monitoring/README.md | 20 + .../examples/nem-monitoring-minikube.yaml | 23 + .../grafana-dashboards/kb8s-app-metrics.json | 1400 ++ .../grafana-dashboards/node-exporter.json | 20937 +++++++++++++++++++ .../grafana-dashboards/onos-kpi.json | 652 + .../grafana-dashboards/voltha-kpi.json | 1172 ++ .../nem-monitoring/grafana-dashboards/xos.json | 7959 +++++++ helm-charts/nem-monitoring/requirements.yaml | 23 + helm-charts/nem-monitoring/templates/NOTES.txt | 12 + .../templates/exporter-deployment.yaml | 38 + .../nem-monitoring/templates/exporter-service.yaml | 30 + .../grafana-dashboard-kb8s-configmap.yaml | 24 + .../templates/grafana-dashboard-node-exporter.yaml | 24 + .../grafana-dashboard-onos-configmap.yaml | 24 + .../grafana-dashboard-voltha-configmap.yaml | 24 + .../templates/grafana-dashboard-xos-configmap.yaml | 24 + helm-charts/nem-monitoring/values.yaml | 232 + helm-charts/onos-progran/.helmignore | 21 + helm-charts/onos-progran/Chart.yaml | 21 + helm-charts/onos-progran/templates/_helpers.tpl | 111 + .../templates/onos-progran-configmap.yaml | 22 + .../templates/onos-progran-debugger-service.yaml | 33 + .../templates/onos-progran-deployment.yaml | 140 + .../onos-progran-log-agent-configmap.yaml | 52 + .../templates/onos-progran-openflow-service.yaml | 33 + .../templates/onos-progran-ovsdb-service.yaml | 33 + .../templates/onos-progran-port22-service.yaml | 33 + .../templates/onos-progran-port4010-service.yaml | 33 + .../templates/onos-progran-port9876-service.yaml | 33 + .../templates/onos-progran-ssh-service.yaml | 33 + .../templates/onos-progran-ui-service.yaml | 33 + helm-charts/onos-progran/values.yaml | 113 + helm-charts/onos/.helmignore | 21 + helm-charts/onos/Chart.yaml | 20 + helm-charts/onos/templates/_helpers.tpl | 110 + helm-charts/onos/templates/configmap.yaml | 22 + helm-charts/onos/templates/debugger-service.yaml | 32 + helm-charts/onos/templates/deployment.yaml | 133 + .../onos/templates/log-agent-configmap.yaml | 53 + helm-charts/onos/templates/openflow-service.yaml | 32 + helm-charts/onos/templates/ovsdb-service.yaml | 32 + helm-charts/onos/templates/ssh-service.yaml | 32 + helm-charts/onos/templates/ui-service.yaml | 32 + helm-charts/onos/values.yaml | 97 + helm-charts/ovsplugin/Chart.yaml | 17 + helm-charts/ovsplugin/templates/_helpers.tpl | 25 + helm-charts/ovsplugin/templates/ovs-cni.yaml | 206 + helm-charts/ovsplugin/values.yaml | 23 + helm-charts/ponnet/Chart.yaml | 17 + helm-charts/ponnet/templates/_helpers.tpl | 25 + helm-charts/ponnet/templates/genie-cni-1.8.yaml | 328 + helm-charts/ponnet/templates/pon0-cni.yaml | 200 + helm-charts/ponnet/values.yaml | 25 + helm-charts/ponsimv2/Chart.yaml | 23 + helm-charts/ponsimv2/templates/_helpers.tpl | 25 + helm-charts/ponsimv2/templates/olt.yaml | 73 + helm-charts/ponsimv2/templates/onu.yaml | 86 + helm-charts/ponsimv2/templates/rg.yaml | 57 + helm-charts/ponsimv2/values.yaml | 36 + helm-charts/sadis-server/Chart.yaml | 17 + .../sadis-server/templates/sadis-deployment.yaml | 48 + .../sadis-server/templates/sadis-service.yaml | 30 + helm-charts/sadis-server/values.yaml | 26 + helm-charts/scripts/helmlint.sh | 66 + helm-charts/scripts/helmrepo.sh | 47 + helm-charts/scripts/pki/.gitignore | 4 + helm-charts/scripts/pki/Makefile | 97 + helm-charts/scripts/pki/README.md | 12 + helm-charts/scripts/pki/xos-pki.cnf | 88 + helm-charts/scripts/wait_for_jobs.sh | 86 + helm-charts/scripts/wait_for_pods.sh | 116 + helm-charts/scripts/yamllint.conf | 13 + helm-charts/storage/README.md | 335 + helm-charts/storage/local-directory/Chart.yaml | 17 + .../local-directory/local-directory-playbook.yaml | 41 + .../storage/local-directory/templates/NOTES.txt | 9 + .../local-directory/templates/localdirs.yaml | 46 + helm-charts/storage/local-directory/values.yaml | 27 + helm-charts/storage/local-provisioner/Chart.yaml | 29 + .../local-provisioner/provisioner-namespace.yaml | 21 + .../templates/00_provisioner_rbac.yaml | 101 + .../local-provisioner/templates/provisioner.yaml | 133 + helm-charts/storage/local-provisioner/values.yaml | 133 + helm-charts/storage/rook-cluster/Chart.yaml | 18 + .../rook-cluster/templates/00_rook_rbac.yaml | 74 + .../storage/rook-cluster/templates/NOTES.txt | 11 + .../rook-cluster/templates/ceph_cluster.yaml | 60 + .../storage/rook-cluster/templates/ceph_fs.yaml | 58 + helm-charts/storage/rook-cluster/values.yaml | 33 + helm-charts/storage/rook-operator/Chart.yaml | 19 + .../storage/rook-operator/requirements.yaml | 19 + .../storage/rook-operator/templates/NOTES.txt | 4 + helm-charts/storage/rook-operator/values.yaml | 23 + helm-charts/storage/rook-tools/Chart.yaml | 20 + helm-charts/storage/rook-tools/templates/NOTES.txt | 11 + .../storage/rook-tools/templates/toolbox.yaml | 61 + helm-charts/storage/rook-tools/values.yaml | 27 + helm-charts/ves-agent/Chart.yaml | 21 + helm-charts/ves-agent/templates/_helpers.tpl | 42 + helm-charts/ves-agent/templates/configMap.yaml | 36 + helm-charts/ves-agent/templates/deployment.yaml | 52 + helm-charts/ves-agent/templates/service.yaml | 33 + helm-charts/ves-agent/values.yaml | 41 + helm-charts/voltha/Chart.yaml | 20 + helm-charts/voltha/requirements.yaml | 20 + helm-charts/voltha/templates/05-namespace.yaml | 18 + .../voltha/templates/10-default-backend.yaml | 68 + helm-charts/voltha/templates/20-configmap.yaml | 21 + .../templates/30-tcp-services-configmap.yaml | 19 + .../templates/40-udp-services-configmap.yaml | 19 + helm-charts/voltha/templates/50-rbac.yaml | 147 + helm-charts/voltha/templates/54-namespace.yaml | 23 + helm-charts/voltha/templates/55-rbac.yaml | 111 + .../voltha/templates/60-cluster-ingress-nginx.yaml | 88 + .../voltha/templates/70-service-ingress-nginx.yaml | 32 + helm-charts/voltha/templates/80-ingress.yaml | 38 + helm-charts/voltha/templates/_helpers.tpl | 60 + helm-charts/voltha/templates/alarm-generator.yaml | 48 + helm-charts/voltha/templates/envoy_for_etcd.yaml | 73 + .../voltha/templates/freeradius-config.yaml | 30 + helm-charts/voltha/templates/freeradius.yaml | 95 + helm-charts/voltha/templates/logconfigmaps.yaml | 48 + helm-charts/voltha/templates/netconf.yaml | 68 + helm-charts/voltha/templates/ofagent.yaml | 54 + helm-charts/voltha/templates/vcli.yaml | 69 + helm-charts/voltha/templates/vcore_for_etcd.yaml | 90 + helm-charts/voltha/values.yaml | 144 + helm-charts/workflows/att-workflow/Chart.yaml | 23 + .../workflows/att-workflow/requirements.yaml | 19 + .../workflows/att-workflow/templates/_helpers.tpl | 47 + .../workflows/att-workflow/templates/_tosca.tpl | 129 + .../att-workflow/templates/tosca-configmap.yaml | 27 + .../att-workflow/templates/tosca-job.yaml | 55 + helm-charts/workflows/att-workflow/values.yaml | 41 + helm-charts/workflows/tt-workflow/Chart.yaml | 23 + .../workflows/tt-workflow/requirements.yaml | 19 + .../workflows/tt-workflow/templates/_helpers.tpl | 47 + .../workflows/tt-workflow/templates/_tosca.tpl | 99 + .../tt-workflow/templates/tosca-configmap.yaml | 27 + .../workflows/tt-workflow/templates/tosca-job.yaml | 55 + helm-charts/workflows/tt-workflow/values.yaml | 37 + helm-charts/xos-core/Chart.yaml | 24 + helm-charts/xos-core/pki/xos-CA.pem | 23 + helm-charts/xos-core/pki/xos-core.key | 27 + helm-charts/xos-core/pki/xos-core.pem | 93 + helm-charts/xos-core/requirements.yaml | 23 + helm-charts/xos-core/templates/50-rbac.yaml | 35 + helm-charts/xos-core/templates/NOTES.txt | 4 + helm-charts/xos-core/templates/_core.tpl | 76 + helm-charts/xos-core/templates/_helpers.tpl | 24 + helm-charts/xos-core/templates/_tosca.tpl | 43 + .../xos-core/templates/chameleon-deployment.yaml | 37 + .../xos-core/templates/chameleon-service.yaml | 30 + helm-charts/xos-core/templates/core-configmap.yaml | 51 + .../xos-core/templates/core-deployment.yaml | 82 + .../xos-core/templates/core-grpc-service.yaml | 37 + .../templates/core-prometheus-service.yaml | 31 + helm-charts/xos-core/templates/core-secrets.yaml | 24 + .../xos-core/templates/coreapi-cert-secret.yaml | 24 + .../templates/tests/test-xos-core-api.yaml | 52 + .../xos-core/templates/tosca-configmap.yaml | 24 + .../xos-core/templates/tosca-deployment.yaml | 56 + helm-charts/xos-core/templates/tosca-service.yaml | 30 + helm-charts/xos-core/values.yaml | 82 + helm-charts/xos-db/Chart.yaml | 22 + helm-charts/xos-db/templates/_helpers.tpl | 33 + helm-charts/xos-db/templates/_persist.tpl | 30 + helm-charts/xos-db/templates/db-configmap.yaml | 24 + helm-charts/xos-db/templates/db-deployment.yaml | 68 + helm-charts/xos-db/templates/db-secrets.yaml | 23 + helm-charts/xos-db/templates/db-service.yaml | 29 + helm-charts/xos-db/values.yaml | 34 + helm-charts/xos-gui/.helmignore | 21 + helm-charts/xos-gui/Chart.yaml | 22 + helm-charts/xos-gui/templates/_helpers.tpl | 62 + helm-charts/xos-gui/templates/_ws.tpl | 26 + helm-charts/xos-gui/templates/gui-configmap.yaml | 51 + helm-charts/xos-gui/templates/gui-deployment.yaml | 69 + helm-charts/xos-gui/templates/gui-service.yaml | 30 + helm-charts/xos-gui/templates/ws-configmap.yaml | 25 + helm-charts/xos-gui/templates/ws-deployment.yaml | 48 + helm-charts/xos-gui/templates/ws-service.yaml | 30 + helm-charts/xos-gui/values.yaml | 39 + .../xos-profiles/base-kubernetes/.helmignore | 21 + .../xos-profiles/base-kubernetes/Chart.yaml | 22 + .../xos-profiles/base-kubernetes/requirements.yaml | 19 + .../base-kubernetes/templates/_helpers.tpl | 52 + .../base-kubernetes/templates/tosca-configmap.yaml | 27 + .../base-kubernetes/templates/tosca-job.yaml | 55 + .../xos-profiles/base-kubernetes/values.yaml | 131 + .../xos-profiles/base-openstack/.helmignore | 21 + helm-charts/xos-profiles/base-openstack/Chart.yaml | 22 + .../xos-profiles/base-openstack/files/node_key | 18 + .../xos-profiles/base-openstack/requirements.yaml | 25 + .../base-openstack/templates/_helpers.tpl | 47 + .../base-openstack/templates/_tosca.tpl | 229 + .../base-openstack/templates/secret.yaml | 23 + .../base-openstack/templates/tosca-configmap.yaml | 38 + .../base-openstack/templates/tosca-job.yaml | 54 + .../xos-profiles/base-openstack/values.yaml | 52 + .../xos-profiles/demo-exampleservice/Chart.yaml | 24 + .../demo-exampleservice/requirements.yaml | 22 + .../demo-exampleservice/templates/_helpers.tpl | 47 + .../demo-exampleservice/templates/_tosca.tpl | 111 + .../templates/tosca-configmap.yaml | 25 + .../demo-exampleservice/templates/tosca-job.yaml | 54 + .../xos-profiles/demo-exampleservice/values.yaml | 42 + .../demo-simpleexampleservice/Chart.yaml | 23 + .../demo-simpleexampleservice/requirements.yaml | 19 + .../templates/_helpers.tpl | 47 + .../tests/test-demo-simpleexampleservice.yaml | 45 + .../templates/tosca-configmap.yaml | 23 + .../templates/tosca-job.yaml | 54 + .../demo-simpleexampleservice/values.yaml | 42 + helm-charts/xos-profiles/mcord/.helmignore | 21 + helm-charts/xos-profiles/mcord/Chart.yaml | 23 + helm-charts/xos-profiles/mcord/requirements.yaml | 33 + .../xos-profiles/mcord/templates/_helpers.tpl | 47 + .../xos-profiles/mcord/templates/_tosca.tpl | 250 + .../mcord/templates/tosca-configmap.yaml | 37 + .../xos-profiles/mcord/templates/tosca-job.yaml | 54 + helm-charts/xos-profiles/mcord/values.yaml | 50 + helm-charts/xos-profiles/ponsim-pod/Chart.yaml | 23 + .../xos-profiles/ponsim-pod/templates/_helpers.tpl | 48 + .../ponsim-pod/templates/tosca-configmap.yaml | 24 + .../ponsim-pod/templates/tosca-job.yaml | 56 + .../xos-profiles/ponsim-pod/tosca/020-pod-olt.yaml | 57 + .../xos-profiles/ponsim-pod/tosca/030-fabric.yaml | 91 + .../ponsim-pod/tosca/040-subscriber.yaml | 58 + .../tosca/att-workflow/010-att-workflow.yaml | 43 + .../tosca/tt-workflow/010-tt-workflow.yaml | 43 + helm-charts/xos-profiles/ponsim-pod/values.yaml | 39 + helm-charts/xos-profiles/rcord-lite/.helmignore | 21 + helm-charts/xos-profiles/rcord-lite/Chart.yaml | 22 + .../xos-profiles/rcord-lite/requirements.yaml | 37 + .../xos-profiles/rcord-lite/templates/_helpers.tpl | 51 + .../xos-profiles/rcord-lite/templates/_tosca.tpl | 385 + .../templates/tests/test-rcord-lite-api.yaml | 45 + .../rcord-lite/templates/tosca-configmap.yaml | 35 + .../rcord-lite/templates/tosca-job.yaml | 55 + helm-charts/xos-profiles/rcord-lite/values.yaml | 53 + helm-charts/xos-profiles/seba-services/Chart.yaml | 23 + .../xos-profiles/seba-services/requirements.yaml | 36 + .../seba-services/templates/_helpers.tpl | 47 + .../seba-services/templates/_tosca.tpl | 357 + .../templates/tests/test-att-workflow.yaml | 45 + .../seba-services/templates/tosca-configmap.yaml | 35 + .../seba-services/templates/tosca-job.yaml | 55 + helm-charts/xos-profiles/seba-services/values.yaml | 62 + .../xos-services/addressmanager/.helmignore | 21 + helm-charts/xos-services/addressmanager/Chart.yaml | 22 + .../addressmanager/templates/_helpers.tpl | 82 + .../addressmanager/templates/configmap.yaml | 23 + .../addressmanager/templates/deployment.yaml | 77 + .../xos-services/addressmanager/values.yaml | 42 + .../xos-services/att-workflow-driver/.helmignore | 21 + .../xos-services/att-workflow-driver/Chart.yaml | 21 + .../att-workflow-driver/templates/_helpers.tpl | 80 + .../att-workflow-driver/templates/_tosca.tpl | 30 + .../att-workflow-driver/templates/configmap.yaml | 22 + .../att-workflow-driver/templates/deployment.yaml | 77 + .../xos-services/att-workflow-driver/values.yaml | 45 + helm-charts/xos-services/epc-service/.helmignore | 21 + helm-charts/xos-services/epc-service/Chart.yaml | 21 + .../epc-service/templates/_helpers.tpl | 78 + .../xos-services/epc-service/templates/_tosca.tpl | 31 + .../epc-service/templates/configmap.yaml | 23 + .../epc-service/templates/deployment.yaml | 76 + helm-charts/xos-services/epc-service/values.yaml | 42 + .../xos-services/exampleservice/.helmignore | 21 + helm-charts/xos-services/exampleservice/Chart.yaml | 22 + .../xos-services/exampleservice/files/id_rsa | 27 + .../exampleservice/templates/_helpers.tpl | 76 + .../exampleservice/templates/_tosca.tpl | 180 + .../exampleservice/templates/configmap.yaml | 23 + .../exampleservice/templates/deployment.yaml | 88 + .../exampleservice/templates/secret.yaml | 23 + .../xos-services/exampleservice/values.yaml | 50 + .../xos-services/fabric-crossconnect/Chart.yaml | 21 + .../fabric-crossconnect/templates/_helpers.tpl | 80 + .../fabric-crossconnect/templates/_tosca.tpl | 30 + .../fabric-crossconnect/templates/configmap.yaml | 22 + .../fabric-crossconnect/templates/deployment.yaml | 76 + .../xos-services/fabric-crossconnect/values.yaml | 45 + helm-charts/xos-services/fabric/.helmignore | 21 + helm-charts/xos-services/fabric/Chart.yaml | 21 + .../xos-services/fabric/templates/_helpers.tpl | 80 + .../xos-services/fabric/templates/_tosca.tpl | 30 + .../xos-services/fabric/templates/configmap.yaml | 22 + .../xos-services/fabric/templates/deployment.yaml | 77 + helm-charts/xos-services/fabric/values.yaml | 45 + helm-charts/xos-services/hippie-oss/.helmignore | 21 + helm-charts/xos-services/hippie-oss/Chart.yaml | 21 + .../xos-services/hippie-oss/templates/_helpers.tpl | 80 + .../xos-services/hippie-oss/templates/_tosca.tpl | 30 + .../hippie-oss/templates/configmap.yaml | 22 + .../hippie-oss/templates/deployment.yaml | 77 + helm-charts/xos-services/hippie-oss/values.yaml | 44 + helm-charts/xos-services/hssdb/.helmignore | 21 + helm-charts/xos-services/hssdb/Chart.yaml | 22 + helm-charts/xos-services/hssdb/files/id_rsa | 27 + .../xos-services/hssdb/templates/_helpers.tpl | 80 + .../xos-services/hssdb/templates/_tosca.tpl | 62 + .../xos-services/hssdb/templates/configmap.yaml | 23 + .../xos-services/hssdb/templates/deployment.yaml | 91 + .../xos-services/hssdb/templates/secret.yaml | 23 + helm-charts/xos-services/hssdb/values.yaml | 52 + .../xos-services/internetemulator/.helmignore | 21 + .../xos-services/internetemulator/Chart.yaml | 22 + .../xos-services/internetemulator/files/id_rsa | 27 + .../internetemulator/templates/_helpers.tpl | 80 + .../internetemulator/templates/_tosca.tpl | 43 + .../internetemulator/templates/configmap.yaml | 23 + .../internetemulator/templates/deployment.yaml | 90 + .../internetemulator/templates/secret.yaml | 23 + .../xos-services/internetemulator/values.yaml | 51 + helm-charts/xos-services/k8sepcservice/Chart.yaml | 21 + .../k8sepcservice/templates/_helpers.tpl | 87 + .../k8sepcservice/templates/_tosca.tpl | 737 + .../k8sepcservice/templates/configmap.yaml | 23 + .../k8sepcservice/templates/deployment.yaml | 74 + helm-charts/xos-services/k8sepcservice/values.yaml | 44 + helm-charts/xos-services/kubernetes/Chart.yaml | 21 + .../xos-services/kubernetes/templates/_helpers.tpl | 76 + .../kubernetes/templates/configmap.yaml | 23 + .../kubernetes/templates/deployment.yaml | 78 + helm-charts/xos-services/kubernetes/values.yaml | 45 + .../xos-services/mcord-subscriber/.helmignore | 21 + .../xos-services/mcord-subscriber/Chart.yaml | 21 + .../mcord-subscriber/templates/_helpers.tpl | 77 + .../mcord-subscriber/templates/_tosca.tpl | 31 + .../mcord-subscriber/templates/configmap.yaml | 23 + .../mcord-subscriber/templates/job.yaml | 72 + .../xos-services/mcord-subscriber/values.yaml | 42 + helm-charts/xos-services/onos-service/.helmignore | 21 + helm-charts/xos-services/onos-service/Chart.yaml | 21 + .../onos-service/templates/_helpers.tpl | 81 + .../xos-services/onos-service/templates/_tosca.tpl | 84 + .../onos-service/templates/configmap.yaml | 22 + .../onos-service/templates/deployment.yaml | 76 + helm-charts/xos-services/onos-service/values.yaml | 51 + helm-charts/xos-services/openstack/.helmignore | 21 + helm-charts/xos-services/openstack/Chart.yaml | 21 + .../xos-services/openstack/templates/_helpers.tpl | 75 + .../xos-services/openstack/templates/_tosca.tpl | 170 + .../openstack/templates/configmap.yaml | 22 + .../openstack/templates/deployment.yaml | 77 + helm-charts/xos-services/openstack/values.yaml | 44 + helm-charts/xos-services/progran/.helmignore | 21 + helm-charts/xos-services/progran/Chart.yaml | 21 + .../xos-services/progran/templates/_helpers.tpl | 77 + .../xos-services/progran/templates/_tosca.tpl | 34 + .../xos-services/progran/templates/configmap.yaml | 23 + .../xos-services/progran/templates/deployment.yaml | 76 + helm-charts/xos-services/progran/values.yaml | 42 + helm-charts/xos-services/rcord/Chart.yaml | 21 + .../xos-services/rcord/templates/_helpers.tpl | 73 + .../xos-services/rcord/templates/_tosca.tpl | 29 + .../xos-services/rcord/templates/configmap.yaml | 22 + .../xos-services/rcord/templates/deployment.yaml | 77 + helm-charts/xos-services/rcord/values.yaml | 45 + helm-charts/xos-services/sdncontroller/.helmignore | 21 + helm-charts/xos-services/sdncontroller/Chart.yaml | 21 + .../xos-services/sdncontroller/files/id_rsa | 27 + .../sdncontroller/templates/_helpers.tpl | 80 + .../sdncontroller/templates/_tosca.tpl | 63 + .../sdncontroller/templates/configmap.yaml | 23 + .../sdncontroller/templates/deployment.yaml | 90 + .../sdncontroller/templates/secret.yaml | 23 + helm-charts/xos-services/sdncontroller/values.yaml | 52 + .../xos-services/simpleexampleservice/Chart.yaml | 21 + .../simpleexampleservice/templates/_helpers.tpl | 81 + .../simpleexampleservice/templates/_tosca.tpl | 71 + .../simpleexampleservice/templates/configmap.yaml | 23 + .../simpleexampleservice/templates/deployment.yaml | 74 + .../xos-services/simpleexampleservice/values.yaml | 46 + .../xos-services/tt-workflow-driver/.helmignore | 21 + .../xos-services/tt-workflow-driver/Chart.yaml | 21 + .../tt-workflow-driver/templates/_helpers.tpl | 80 + .../tt-workflow-driver/templates/_tosca.tpl | 30 + .../tt-workflow-driver/templates/configmap.yaml | 22 + .../tt-workflow-driver/templates/deployment.yaml | 77 + .../xos-services/tt-workflow-driver/values.yaml | 45 + helm-charts/xos-services/vhss/.helmignore | 21 + helm-charts/xos-services/vhss/Chart.yaml | 22 + helm-charts/xos-services/vhss/files/id_rsa | 27 + .../xos-services/vhss/templates/_helpers.tpl | 80 + helm-charts/xos-services/vhss/templates/_tosca.tpl | 62 + .../xos-services/vhss/templates/configmap.yaml | 23 + .../xos-services/vhss/templates/deployment.yaml | 90 + .../xos-services/vhss/templates/secret.yaml | 23 + helm-charts/xos-services/vhss/values.yaml | 52 + helm-charts/xos-services/vmme/.helmignore | 21 + helm-charts/xos-services/vmme/Chart.yaml | 22 + helm-charts/xos-services/vmme/files/id_rsa | 27 + .../xos-services/vmme/templates/_helpers.tpl | 80 + helm-charts/xos-services/vmme/templates/_tosca.tpl | 62 + .../xos-services/vmme/templates/configmap.yaml | 23 + .../xos-services/vmme/templates/deployment.yaml | 90 + .../xos-services/vmme/templates/secret.yaml | 23 + helm-charts/xos-services/vmme/values.yaml | 52 + helm-charts/xos-services/volt/.helmignore | 21 + helm-charts/xos-services/volt/Chart.yaml | 21 + .../xos-services/volt/templates/_helpers.tpl | 80 + helm-charts/xos-services/volt/templates/_tosca.tpl | 36 + .../xos-services/volt/templates/configmap.yaml | 22 + .../xos-services/volt/templates/deployment.yaml | 77 + helm-charts/xos-services/volt/values.yaml | 47 + helm-charts/xos-services/vrouter/.helmignore | 21 + helm-charts/xos-services/vrouter/Chart.yaml | 21 + .../xos-services/vrouter/templates/_helpers.tpl | 77 + .../xos-services/vrouter/templates/_tosca.tpl | 30 + .../xos-services/vrouter/templates/configmap.yaml | 23 + .../xos-services/vrouter/templates/deployment.yaml | 77 + helm-charts/xos-services/vrouter/values.yaml | 43 + helm-charts/xos-services/vsg-hw/Chart.yaml | 21 + .../xos-services/vsg-hw/templates/_helpers.tpl | 77 + .../xos-services/vsg-hw/templates/_tosca.tpl | 30 + .../xos-services/vsg-hw/templates/configmap.yaml | 22 + .../xos-services/vsg-hw/templates/deployment.yaml | 76 + helm-charts/xos-services/vsg-hw/values.yaml | 42 + helm-charts/xos-services/vspgwc/.helmignore | 21 + helm-charts/xos-services/vspgwc/Chart.yaml | 21 + helm-charts/xos-services/vspgwc/files/id_rsa | 27 + .../xos-services/vspgwc/templates/_helpers.tpl | 80 + .../xos-services/vspgwc/templates/_tosca.tpl | 62 + .../xos-services/vspgwc/templates/configmap.yaml | 23 + .../xos-services/vspgwc/templates/deployment.yaml | 90 + .../xos-services/vspgwc/templates/secret.yaml | 23 + helm-charts/xos-services/vspgwc/values.yaml | 52 + helm-charts/xos-services/vspgwu/.helmignore | 21 + helm-charts/xos-services/vspgwu/Chart.yaml | 21 + helm-charts/xos-services/vspgwu/files/id_rsa | 27 + .../xos-services/vspgwu/templates/_helpers.tpl | 103 + .../xos-services/vspgwu/templates/_tosca.tpl | 62 + .../xos-services/vspgwu/templates/configmap.yaml | 23 + .../xos-services/vspgwu/templates/deployment.yaml | 90 + .../xos-services/vspgwu/templates/secret.yaml | 23 + helm-charts/xos-services/vspgwu/values.yaml | 52 + helm-charts/xos-services/vtn-service/.helmignore | 21 + helm-charts/xos-services/vtn-service/Chart.yaml | 22 + .../vtn-service/templates/_helpers.tpl | 77 + .../xos-services/vtn-service/templates/_tosca.tpl | 67 + .../vtn-service/templates/configmap.yaml | 23 + .../vtn-service/templates/deployment.yaml | 76 + helm-charts/xos-services/vtn-service/values.yaml | 45 + helm-charts/xos-tools/kafkacat/Chart.yaml | 23 + helm-charts/xos-tools/kafkacat/templates/NOTES.txt | 11 + .../xos-tools/kafkacat/templates/deployment.yaml | 41 + helm-charts/xos-tools/kafkacat/values.yaml | 34 + helm-charts/xos-tools/xos-tester/Chart.yaml | 23 + .../xos-tools/xos-tester/templates/NOTES.txt | 7 + .../xos-tools/xos-tester/templates/_helpers.tpl | 18 + .../xos-tools/xos-tester/templates/configmap.yaml | 26 + .../xos-tools/xos-tester/templates/job.yaml | 51 + helm-charts/xos-tools/xos-tester/values.yaml | 35 + helm-charts/xos-tools/xossh/Chart.yaml | 22 + helm-charts/xos-tools/xossh/README.md | 15 + helm-charts/xos-tools/xossh/templates/_helpers.tpl | 47 + .../xos-tools/xossh/templates/configmap.yaml | 23 + .../xos-tools/xossh/templates/deployment.yaml | 85 + helm-charts/xos-tools/xossh/values.yaml | 62 + helm-charts/xos-tools/xossh/xossh-attach.sh | 18 + 600 files changed, 64496 insertions(+) create mode 100644 helm-charts/README.md create mode 100644 helm-charts/VERSION create mode 100644 helm-charts/abstract-olt/.helmignore create mode 100644 helm-charts/abstract-olt/Chart.yaml create mode 100644 helm-charts/abstract-olt/templates/_helpers.tpl create mode 100644 helm-charts/abstract-olt/templates/deployment.yaml create mode 100644 helm-charts/abstract-olt/values.yaml create mode 100644 helm-charts/bbsim/Chart.yaml create mode 100644 helm-charts/bbsim/templates/NOTES.txt create mode 100644 helm-charts/bbsim/templates/_helpers.tpl create mode 100644 helm-charts/bbsim/templates/deployment.yaml create mode 100644 helm-charts/bbsim/templates/service.yaml create mode 100644 helm-charts/bbsim/templates/tests/test-bbsim.yaml create mode 100644 helm-charts/bbsim/values.yaml create mode 100644 helm-charts/configs/onos-debug.yaml create mode 100644 helm-charts/configs/seba-ponsim-latest.yaml create mode 100644 helm-charts/configs/seba-ponsim-voltha-1.6.yaml create mode 100644 helm-charts/configs/seba-ponsim.yaml create mode 100644 helm-charts/configs/siab-v1.0.0.yaml create mode 100644 helm-charts/dhcp-server/Chart.yaml create mode 100644 helm-charts/dhcp-server/templates/_helpers.tpl create mode 100644 helm-charts/dhcp-server/templates/configmap.yaml create mode 100644 helm-charts/dhcp-server/templates/deployment.yaml create mode 100644 helm-charts/dhcp-server/templates/dhcp-service.yaml create mode 100644 helm-charts/dhcp-server/values.yaml create mode 100644 helm-charts/etcd-cluster/.helmignore create mode 100644 helm-charts/etcd-cluster/Chart.yaml create mode 100644 helm-charts/etcd-cluster/templates/etcd-cluster-service.yaml create mode 100644 helm-charts/etcd-cluster/templates/etcd-cluster.yaml create mode 100644 helm-charts/etcd-cluster/values.yaml create mode 100644 helm-charts/examples/add-trap-flow.json create mode 100755 helm-charts/examples/add-trap-flow.sh create mode 100644 helm-charts/examples/adminuser-values.yaml create mode 100644 helm-charts/examples/api-test-images.yaml create mode 100644 helm-charts/examples/api-test-values.yaml create mode 100644 helm-charts/examples/bbsim-16.yaml create mode 100644 helm-charts/examples/bbsim-dhcp.yaml create mode 100644 helm-charts/examples/compute-nodes.yaml create mode 100644 helm-charts/examples/fabric-values.yaml create mode 100644 helm-charts/examples/filter-images.yaml create mode 100644 helm-charts/examples/image-tag-candidate.yaml create mode 100644 helm-charts/examples/imagePullPolicy-IfNotPresent.yaml create mode 100644 helm-charts/examples/kafka-production.yaml create mode 100644 helm-charts/examples/kafka-single.yaml create mode 100644 helm-charts/examples/logging-single.yaml create mode 100644 helm-charts/examples/mcord-images.yaml create mode 100644 helm-charts/examples/onos-nodeport-values.yaml create mode 100644 helm-charts/examples/openstack-dev-master-node.yaml create mode 100644 helm-charts/examples/openstack-instance-tosca.yaml create mode 100644 helm-charts/examples/registry-cephfs.yaml create mode 100644 helm-charts/examples/sample-rcord-subscriber-tosca.yaml create mode 100644 helm-charts/examples/xos-db-ceph-rbd.yaml create mode 100644 helm-charts/examples/xos-db-local-dir.yaml create mode 100644 helm-charts/examples/xossh-candidate.yaml create mode 160000 helm-charts/helm-charts-org create mode 100644 helm-charts/logging/.helmignore create mode 100644 helm-charts/logging/Chart.yaml create mode 100644 helm-charts/logging/README.md create mode 100644 helm-charts/logging/requirements.yaml create mode 100644 helm-charts/logging/templates/NOTES.txt create mode 100644 helm-charts/logging/values.yaml create mode 100644 helm-charts/mavenrepo/Chart.yaml create mode 100644 helm-charts/mavenrepo/templates/_helpers.tpl create mode 100644 helm-charts/mavenrepo/templates/deployment.yaml create mode 100644 helm-charts/mavenrepo/templates/repo-service.yaml create mode 100644 helm-charts/mavenrepo/values.yaml create mode 100644 helm-charts/mcord-release/Dockerfile.sriovds/Dockerfile create mode 100644 helm-charts/mcord-release/assets/mcord-architecture.png create mode 100644 helm-charts/mcord-release/mcord-services/.helmignore create mode 100644 helm-charts/mcord-release/mcord-services/Chart.yaml create mode 100644 helm-charts/mcord-release/mcord-services/templates/NOTES.txt create mode 100644 helm-charts/mcord-release/mcord-services/templates/_helpers.tpl create mode 100644 helm-charts/mcord-release/mcord-services/templates/hss.yaml create mode 100644 helm-charts/mcord-release/mcord-services/templates/hssdb.yaml create mode 100644 helm-charts/mcord-release/mcord-services/templates/mme.yaml create mode 100644 helm-charts/mcord-release/mcord-services/templates/networks.yaml create mode 100644 helm-charts/mcord-release/mcord-services/templates/spgwc.yaml create mode 100644 helm-charts/mcord-release/mcord-services/templates/spgwu.yaml create mode 100644 helm-charts/mcord-release/mcord-services/values.yaml create mode 100644 helm-charts/mcord-release/mcord-setup/.helmignore create mode 100644 helm-charts/mcord-release/mcord-setup/Chart.yaml create mode 100644 helm-charts/mcord-release/mcord-setup/templates/NOTES.txt create mode 100644 helm-charts/mcord-release/mcord-setup/templates/_helpers.tpl create mode 100644 helm-charts/mcord-release/mcord-setup/templates/multus-sriov-ds.yaml create mode 100644 helm-charts/mcord-release/mcord-setup/templates/sriov-conf.yaml create mode 100644 helm-charts/mcord-release/mcord-setup/values.yaml create mode 100644 helm-charts/mcord/cni-config/01-cni-service-account.yaml create mode 100644 helm-charts/mcord/cni-config/02-network-crd.yaml create mode 100644 helm-charts/mcord/cni-config/03-network-definition.yaml create mode 100644 helm-charts/mcord/cni-config/04-sriov-device-plugin-configmap.yaml create mode 100644 helm-charts/mcord/cni-config/05-sriov-device-plugin.yaml create mode 100644 helm-charts/mcord/mcord-bbu/.helmignore create mode 100644 helm-charts/mcord/mcord-bbu/Chart.yaml create mode 100644 helm-charts/mcord/mcord-bbu/templates/_helpers.tpl create mode 100644 helm-charts/mcord/mcord-bbu/templates/accelleran.yaml create mode 100644 helm-charts/mcord/mcord-bbu/templates/cm.yaml create mode 100644 helm-charts/mcord/mcord-bbu/values.yaml create mode 100644 helm-charts/mcord/mcord-cdn-local-free/Chart.yaml create mode 100644 helm-charts/mcord/mcord-cdn-local-free/templates/cm.yaml create mode 100644 helm-charts/mcord/mcord-cdn-local-free/templates/nginx.yaml create mode 100644 helm-charts/mcord/mcord-cdn-local-free/values.yaml create mode 100644 helm-charts/mcord/mcord-cdn-local/Chart.yaml create mode 100644 helm-charts/mcord/mcord-cdn-local/templates/cm.yaml create mode 100644 helm-charts/mcord/mcord-cdn-local/templates/nginx.yaml create mode 100644 helm-charts/mcord/mcord-cdn-local/values.yaml create mode 100644 helm-charts/mcord/mcord-cdn-remote-free/Chart.yaml create mode 100644 helm-charts/mcord/mcord-cdn-remote-free/templates/remote-streaming.yaml create mode 100644 helm-charts/mcord/mcord-cdn-remote-free/values.yaml create mode 100644 helm-charts/mcord/mcord-cdn-remote/Chart.yaml create mode 100644 helm-charts/mcord/mcord-cdn-remote/templates/cm.yaml create mode 100644 helm-charts/mcord/mcord-cdn-remote/templates/namespace.yaml create mode 100644 helm-charts/mcord/mcord-cdn-remote/templates/remote-vlc.yaml create mode 100644 helm-charts/mcord/mcord-cdn-remote/templates/wowza.yaml create mode 100644 helm-charts/mcord/mcord-cdn-remote/values.yaml create mode 100644 helm-charts/mcord/mcord-control-plane/Chart.yaml create mode 100644 helm-charts/mcord/mcord-control-plane/templates/_helpers.tpl create mode 100644 helm-charts/mcord/mcord-control-plane/templates/cassandra.yaml create mode 100644 helm-charts/mcord/mcord-control-plane/templates/cm.yaml create mode 100644 helm-charts/mcord/mcord-control-plane/templates/cp.yaml create mode 100644 helm-charts/mcord/mcord-control-plane/templates/hss.yaml create mode 100644 helm-charts/mcord/mcord-control-plane/templates/mme.yaml create mode 100644 helm-charts/mcord/mcord-control-plane/values.yaml create mode 100644 helm-charts/mcord/mcord-data-plane/.helmignore create mode 100644 helm-charts/mcord/mcord-data-plane/Chart.yaml create mode 100644 helm-charts/mcord/mcord-data-plane/templates/_helpers.tpl create mode 100644 helm-charts/mcord/mcord-data-plane/templates/cm.yaml create mode 100644 helm-charts/mcord/mcord-data-plane/templates/dp.yaml create mode 100644 helm-charts/mcord/mcord-data-plane/values.yaml create mode 100644 helm-charts/mininet/.helmignore create mode 100644 helm-charts/mininet/Chart.yaml create mode 100644 helm-charts/mininet/templates/_helpers.tpl create mode 100644 helm-charts/mininet/templates/configmap.yaml create mode 100644 helm-charts/mininet/templates/deployment.yaml create mode 100644 helm-charts/mininet/toposcripts/topo.py create mode 100644 helm-charts/mininet/values.yaml create mode 100644 helm-charts/nem-monitoring/.helmignore create mode 100644 helm-charts/nem-monitoring/Chart.yaml create mode 100644 helm-charts/nem-monitoring/README.md create mode 100644 helm-charts/nem-monitoring/examples/nem-monitoring-minikube.yaml create mode 100644 helm-charts/nem-monitoring/grafana-dashboards/kb8s-app-metrics.json create mode 100644 helm-charts/nem-monitoring/grafana-dashboards/node-exporter.json create mode 100644 helm-charts/nem-monitoring/grafana-dashboards/onos-kpi.json create mode 100644 helm-charts/nem-monitoring/grafana-dashboards/voltha-kpi.json create mode 100644 helm-charts/nem-monitoring/grafana-dashboards/xos.json create mode 100644 helm-charts/nem-monitoring/requirements.yaml create mode 100644 helm-charts/nem-monitoring/templates/NOTES.txt create mode 100644 helm-charts/nem-monitoring/templates/exporter-deployment.yaml create mode 100644 helm-charts/nem-monitoring/templates/exporter-service.yaml create mode 100644 helm-charts/nem-monitoring/templates/grafana-dashboard-kb8s-configmap.yaml create mode 100644 helm-charts/nem-monitoring/templates/grafana-dashboard-node-exporter.yaml create mode 100644 helm-charts/nem-monitoring/templates/grafana-dashboard-onos-configmap.yaml create mode 100644 helm-charts/nem-monitoring/templates/grafana-dashboard-voltha-configmap.yaml create mode 100644 helm-charts/nem-monitoring/templates/grafana-dashboard-xos-configmap.yaml create mode 100644 helm-charts/nem-monitoring/values.yaml create mode 100644 helm-charts/onos-progran/.helmignore create mode 100644 helm-charts/onos-progran/Chart.yaml create mode 100644 helm-charts/onos-progran/templates/_helpers.tpl create mode 100644 helm-charts/onos-progran/templates/onos-progran-configmap.yaml create mode 100644 helm-charts/onos-progran/templates/onos-progran-debugger-service.yaml create mode 100644 helm-charts/onos-progran/templates/onos-progran-deployment.yaml create mode 100644 helm-charts/onos-progran/templates/onos-progran-log-agent-configmap.yaml create mode 100644 helm-charts/onos-progran/templates/onos-progran-openflow-service.yaml create mode 100644 helm-charts/onos-progran/templates/onos-progran-ovsdb-service.yaml create mode 100644 helm-charts/onos-progran/templates/onos-progran-port22-service.yaml create mode 100644 helm-charts/onos-progran/templates/onos-progran-port4010-service.yaml create mode 100644 helm-charts/onos-progran/templates/onos-progran-port9876-service.yaml create mode 100644 helm-charts/onos-progran/templates/onos-progran-ssh-service.yaml create mode 100644 helm-charts/onos-progran/templates/onos-progran-ui-service.yaml create mode 100644 helm-charts/onos-progran/values.yaml create mode 100644 helm-charts/onos/.helmignore create mode 100644 helm-charts/onos/Chart.yaml create mode 100644 helm-charts/onos/templates/_helpers.tpl create mode 100644 helm-charts/onos/templates/configmap.yaml create mode 100644 helm-charts/onos/templates/debugger-service.yaml create mode 100644 helm-charts/onos/templates/deployment.yaml create mode 100644 helm-charts/onos/templates/log-agent-configmap.yaml create mode 100644 helm-charts/onos/templates/openflow-service.yaml create mode 100644 helm-charts/onos/templates/ovsdb-service.yaml create mode 100644 helm-charts/onos/templates/ssh-service.yaml create mode 100644 helm-charts/onos/templates/ui-service.yaml create mode 100644 helm-charts/onos/values.yaml create mode 100644 helm-charts/ovsplugin/Chart.yaml create mode 100644 helm-charts/ovsplugin/templates/_helpers.tpl create mode 100644 helm-charts/ovsplugin/templates/ovs-cni.yaml create mode 100644 helm-charts/ovsplugin/values.yaml create mode 100644 helm-charts/ponnet/Chart.yaml create mode 100644 helm-charts/ponnet/templates/_helpers.tpl create mode 100644 helm-charts/ponnet/templates/genie-cni-1.8.yaml create mode 100644 helm-charts/ponnet/templates/pon0-cni.yaml create mode 100644 helm-charts/ponnet/values.yaml create mode 100644 helm-charts/ponsimv2/Chart.yaml create mode 100644 helm-charts/ponsimv2/templates/_helpers.tpl create mode 100644 helm-charts/ponsimv2/templates/olt.yaml create mode 100644 helm-charts/ponsimv2/templates/onu.yaml create mode 100644 helm-charts/ponsimv2/templates/rg.yaml create mode 100644 helm-charts/ponsimv2/values.yaml create mode 100644 helm-charts/sadis-server/Chart.yaml create mode 100644 helm-charts/sadis-server/templates/sadis-deployment.yaml create mode 100644 helm-charts/sadis-server/templates/sadis-service.yaml create mode 100644 helm-charts/sadis-server/values.yaml create mode 100755 helm-charts/scripts/helmlint.sh create mode 100755 helm-charts/scripts/helmrepo.sh create mode 100644 helm-charts/scripts/pki/.gitignore create mode 100644 helm-charts/scripts/pki/Makefile create mode 100644 helm-charts/scripts/pki/README.md create mode 100644 helm-charts/scripts/pki/xos-pki.cnf create mode 100755 helm-charts/scripts/wait_for_jobs.sh create mode 100755 helm-charts/scripts/wait_for_pods.sh create mode 100644 helm-charts/scripts/yamllint.conf create mode 100644 helm-charts/storage/README.md create mode 100644 helm-charts/storage/local-directory/Chart.yaml create mode 100644 helm-charts/storage/local-directory/local-directory-playbook.yaml create mode 100644 helm-charts/storage/local-directory/templates/NOTES.txt create mode 100644 helm-charts/storage/local-directory/templates/localdirs.yaml create mode 100644 helm-charts/storage/local-directory/values.yaml create mode 100644 helm-charts/storage/local-provisioner/Chart.yaml create mode 100644 helm-charts/storage/local-provisioner/provisioner-namespace.yaml create mode 100644 helm-charts/storage/local-provisioner/templates/00_provisioner_rbac.yaml create mode 100644 helm-charts/storage/local-provisioner/templates/provisioner.yaml create mode 100644 helm-charts/storage/local-provisioner/values.yaml create mode 100644 helm-charts/storage/rook-cluster/Chart.yaml create mode 100644 helm-charts/storage/rook-cluster/templates/00_rook_rbac.yaml create mode 100644 helm-charts/storage/rook-cluster/templates/NOTES.txt create mode 100644 helm-charts/storage/rook-cluster/templates/ceph_cluster.yaml create mode 100644 helm-charts/storage/rook-cluster/templates/ceph_fs.yaml create mode 100644 helm-charts/storage/rook-cluster/values.yaml create mode 100644 helm-charts/storage/rook-operator/Chart.yaml create mode 100644 helm-charts/storage/rook-operator/requirements.yaml create mode 100644 helm-charts/storage/rook-operator/templates/NOTES.txt create mode 100644 helm-charts/storage/rook-operator/values.yaml create mode 100644 helm-charts/storage/rook-tools/Chart.yaml create mode 100644 helm-charts/storage/rook-tools/templates/NOTES.txt create mode 100644 helm-charts/storage/rook-tools/templates/toolbox.yaml create mode 100644 helm-charts/storage/rook-tools/values.yaml create mode 100644 helm-charts/ves-agent/Chart.yaml create mode 100644 helm-charts/ves-agent/templates/_helpers.tpl create mode 100644 helm-charts/ves-agent/templates/configMap.yaml create mode 100644 helm-charts/ves-agent/templates/deployment.yaml create mode 100644 helm-charts/ves-agent/templates/service.yaml create mode 100644 helm-charts/ves-agent/values.yaml create mode 100644 helm-charts/voltha/Chart.yaml create mode 100644 helm-charts/voltha/requirements.yaml create mode 100644 helm-charts/voltha/templates/05-namespace.yaml create mode 100644 helm-charts/voltha/templates/10-default-backend.yaml create mode 100644 helm-charts/voltha/templates/20-configmap.yaml create mode 100644 helm-charts/voltha/templates/30-tcp-services-configmap.yaml create mode 100644 helm-charts/voltha/templates/40-udp-services-configmap.yaml create mode 100644 helm-charts/voltha/templates/50-rbac.yaml create mode 100644 helm-charts/voltha/templates/54-namespace.yaml create mode 100644 helm-charts/voltha/templates/55-rbac.yaml create mode 100644 helm-charts/voltha/templates/60-cluster-ingress-nginx.yaml create mode 100644 helm-charts/voltha/templates/70-service-ingress-nginx.yaml create mode 100644 helm-charts/voltha/templates/80-ingress.yaml create mode 100644 helm-charts/voltha/templates/_helpers.tpl create mode 100644 helm-charts/voltha/templates/alarm-generator.yaml create mode 100644 helm-charts/voltha/templates/envoy_for_etcd.yaml create mode 100644 helm-charts/voltha/templates/freeradius-config.yaml create mode 100644 helm-charts/voltha/templates/freeradius.yaml create mode 100644 helm-charts/voltha/templates/logconfigmaps.yaml create mode 100644 helm-charts/voltha/templates/netconf.yaml create mode 100644 helm-charts/voltha/templates/ofagent.yaml create mode 100644 helm-charts/voltha/templates/vcli.yaml create mode 100644 helm-charts/voltha/templates/vcore_for_etcd.yaml create mode 100644 helm-charts/voltha/values.yaml create mode 100644 helm-charts/workflows/att-workflow/Chart.yaml create mode 100644 helm-charts/workflows/att-workflow/requirements.yaml create mode 100644 helm-charts/workflows/att-workflow/templates/_helpers.tpl create mode 100644 helm-charts/workflows/att-workflow/templates/_tosca.tpl create mode 100644 helm-charts/workflows/att-workflow/templates/tosca-configmap.yaml create mode 100644 helm-charts/workflows/att-workflow/templates/tosca-job.yaml create mode 100644 helm-charts/workflows/att-workflow/values.yaml create mode 100644 helm-charts/workflows/tt-workflow/Chart.yaml create mode 100644 helm-charts/workflows/tt-workflow/requirements.yaml create mode 100644 helm-charts/workflows/tt-workflow/templates/_helpers.tpl create mode 100644 helm-charts/workflows/tt-workflow/templates/_tosca.tpl create mode 100644 helm-charts/workflows/tt-workflow/templates/tosca-configmap.yaml create mode 100644 helm-charts/workflows/tt-workflow/templates/tosca-job.yaml create mode 100644 helm-charts/workflows/tt-workflow/values.yaml create mode 100644 helm-charts/xos-core/Chart.yaml create mode 100644 helm-charts/xos-core/pki/xos-CA.pem create mode 100644 helm-charts/xos-core/pki/xos-core.key create mode 100644 helm-charts/xos-core/pki/xos-core.pem create mode 100644 helm-charts/xos-core/requirements.yaml create mode 100644 helm-charts/xos-core/templates/50-rbac.yaml create mode 100644 helm-charts/xos-core/templates/NOTES.txt create mode 100644 helm-charts/xos-core/templates/_core.tpl create mode 100644 helm-charts/xos-core/templates/_helpers.tpl create mode 100644 helm-charts/xos-core/templates/_tosca.tpl create mode 100644 helm-charts/xos-core/templates/chameleon-deployment.yaml create mode 100644 helm-charts/xos-core/templates/chameleon-service.yaml create mode 100644 helm-charts/xos-core/templates/core-configmap.yaml create mode 100644 helm-charts/xos-core/templates/core-deployment.yaml create mode 100644 helm-charts/xos-core/templates/core-grpc-service.yaml create mode 100644 helm-charts/xos-core/templates/core-prometheus-service.yaml create mode 100644 helm-charts/xos-core/templates/core-secrets.yaml create mode 100644 helm-charts/xos-core/templates/coreapi-cert-secret.yaml create mode 100644 helm-charts/xos-core/templates/tests/test-xos-core-api.yaml create mode 100644 helm-charts/xos-core/templates/tosca-configmap.yaml create mode 100644 helm-charts/xos-core/templates/tosca-deployment.yaml create mode 100644 helm-charts/xos-core/templates/tosca-service.yaml create mode 100644 helm-charts/xos-core/values.yaml create mode 100644 helm-charts/xos-db/Chart.yaml create mode 100644 helm-charts/xos-db/templates/_helpers.tpl create mode 100644 helm-charts/xos-db/templates/_persist.tpl create mode 100644 helm-charts/xos-db/templates/db-configmap.yaml create mode 100644 helm-charts/xos-db/templates/db-deployment.yaml create mode 100644 helm-charts/xos-db/templates/db-secrets.yaml create mode 100644 helm-charts/xos-db/templates/db-service.yaml create mode 100644 helm-charts/xos-db/values.yaml create mode 100644 helm-charts/xos-gui/.helmignore create mode 100644 helm-charts/xos-gui/Chart.yaml create mode 100644 helm-charts/xos-gui/templates/_helpers.tpl create mode 100644 helm-charts/xos-gui/templates/_ws.tpl create mode 100644 helm-charts/xos-gui/templates/gui-configmap.yaml create mode 100644 helm-charts/xos-gui/templates/gui-deployment.yaml create mode 100644 helm-charts/xos-gui/templates/gui-service.yaml create mode 100644 helm-charts/xos-gui/templates/ws-configmap.yaml create mode 100644 helm-charts/xos-gui/templates/ws-deployment.yaml create mode 100644 helm-charts/xos-gui/templates/ws-service.yaml create mode 100644 helm-charts/xos-gui/values.yaml create mode 100644 helm-charts/xos-profiles/base-kubernetes/.helmignore create mode 100644 helm-charts/xos-profiles/base-kubernetes/Chart.yaml create mode 100644 helm-charts/xos-profiles/base-kubernetes/requirements.yaml create mode 100644 helm-charts/xos-profiles/base-kubernetes/templates/_helpers.tpl create mode 100644 helm-charts/xos-profiles/base-kubernetes/templates/tosca-configmap.yaml create mode 100644 helm-charts/xos-profiles/base-kubernetes/templates/tosca-job.yaml create mode 100644 helm-charts/xos-profiles/base-kubernetes/values.yaml create mode 100644 helm-charts/xos-profiles/base-openstack/.helmignore create mode 100644 helm-charts/xos-profiles/base-openstack/Chart.yaml create mode 100644 helm-charts/xos-profiles/base-openstack/files/node_key create mode 100644 helm-charts/xos-profiles/base-openstack/requirements.yaml create mode 100644 helm-charts/xos-profiles/base-openstack/templates/_helpers.tpl create mode 100644 helm-charts/xos-profiles/base-openstack/templates/_tosca.tpl create mode 100644 helm-charts/xos-profiles/base-openstack/templates/secret.yaml create mode 100644 helm-charts/xos-profiles/base-openstack/templates/tosca-configmap.yaml create mode 100644 helm-charts/xos-profiles/base-openstack/templates/tosca-job.yaml create mode 100644 helm-charts/xos-profiles/base-openstack/values.yaml create mode 100644 helm-charts/xos-profiles/demo-exampleservice/Chart.yaml create mode 100644 helm-charts/xos-profiles/demo-exampleservice/requirements.yaml create mode 100644 helm-charts/xos-profiles/demo-exampleservice/templates/_helpers.tpl create mode 100644 helm-charts/xos-profiles/demo-exampleservice/templates/_tosca.tpl create mode 100644 helm-charts/xos-profiles/demo-exampleservice/templates/tosca-configmap.yaml create mode 100644 helm-charts/xos-profiles/demo-exampleservice/templates/tosca-job.yaml create mode 100644 helm-charts/xos-profiles/demo-exampleservice/values.yaml create mode 100644 helm-charts/xos-profiles/demo-simpleexampleservice/Chart.yaml create mode 100644 helm-charts/xos-profiles/demo-simpleexampleservice/requirements.yaml create mode 100644 helm-charts/xos-profiles/demo-simpleexampleservice/templates/_helpers.tpl create mode 100644 helm-charts/xos-profiles/demo-simpleexampleservice/templates/tests/test-demo-simpleexampleservice.yaml create mode 100644 helm-charts/xos-profiles/demo-simpleexampleservice/templates/tosca-configmap.yaml create mode 100644 helm-charts/xos-profiles/demo-simpleexampleservice/templates/tosca-job.yaml create mode 100644 helm-charts/xos-profiles/demo-simpleexampleservice/values.yaml create mode 100644 helm-charts/xos-profiles/mcord/.helmignore create mode 100644 helm-charts/xos-profiles/mcord/Chart.yaml create mode 100644 helm-charts/xos-profiles/mcord/requirements.yaml create mode 100644 helm-charts/xos-profiles/mcord/templates/_helpers.tpl create mode 100644 helm-charts/xos-profiles/mcord/templates/_tosca.tpl create mode 100644 helm-charts/xos-profiles/mcord/templates/tosca-configmap.yaml create mode 100644 helm-charts/xos-profiles/mcord/templates/tosca-job.yaml create mode 100644 helm-charts/xos-profiles/mcord/values.yaml create mode 100644 helm-charts/xos-profiles/ponsim-pod/Chart.yaml create mode 100644 helm-charts/xos-profiles/ponsim-pod/templates/_helpers.tpl create mode 100644 helm-charts/xos-profiles/ponsim-pod/templates/tosca-configmap.yaml create mode 100644 helm-charts/xos-profiles/ponsim-pod/templates/tosca-job.yaml create mode 100644 helm-charts/xos-profiles/ponsim-pod/tosca/020-pod-olt.yaml create mode 100644 helm-charts/xos-profiles/ponsim-pod/tosca/030-fabric.yaml create mode 100644 helm-charts/xos-profiles/ponsim-pod/tosca/040-subscriber.yaml create mode 100644 helm-charts/xos-profiles/ponsim-pod/tosca/att-workflow/010-att-workflow.yaml create mode 100644 helm-charts/xos-profiles/ponsim-pod/tosca/tt-workflow/010-tt-workflow.yaml create mode 100644 helm-charts/xos-profiles/ponsim-pod/values.yaml create mode 100644 helm-charts/xos-profiles/rcord-lite/.helmignore create mode 100644 helm-charts/xos-profiles/rcord-lite/Chart.yaml create mode 100644 helm-charts/xos-profiles/rcord-lite/requirements.yaml create mode 100644 helm-charts/xos-profiles/rcord-lite/templates/_helpers.tpl create mode 100644 helm-charts/xos-profiles/rcord-lite/templates/_tosca.tpl create mode 100644 helm-charts/xos-profiles/rcord-lite/templates/tests/test-rcord-lite-api.yaml create mode 100644 helm-charts/xos-profiles/rcord-lite/templates/tosca-configmap.yaml create mode 100644 helm-charts/xos-profiles/rcord-lite/templates/tosca-job.yaml create mode 100644 helm-charts/xos-profiles/rcord-lite/values.yaml create mode 100644 helm-charts/xos-profiles/seba-services/Chart.yaml create mode 100644 helm-charts/xos-profiles/seba-services/requirements.yaml create mode 100644 helm-charts/xos-profiles/seba-services/templates/_helpers.tpl create mode 100644 helm-charts/xos-profiles/seba-services/templates/_tosca.tpl create mode 100644 helm-charts/xos-profiles/seba-services/templates/tests/test-att-workflow.yaml create mode 100644 helm-charts/xos-profiles/seba-services/templates/tosca-configmap.yaml create mode 100644 helm-charts/xos-profiles/seba-services/templates/tosca-job.yaml create mode 100644 helm-charts/xos-profiles/seba-services/values.yaml create mode 100644 helm-charts/xos-services/addressmanager/.helmignore create mode 100644 helm-charts/xos-services/addressmanager/Chart.yaml create mode 100644 helm-charts/xos-services/addressmanager/templates/_helpers.tpl create mode 100644 helm-charts/xos-services/addressmanager/templates/configmap.yaml create mode 100644 helm-charts/xos-services/addressmanager/templates/deployment.yaml create mode 100644 helm-charts/xos-services/addressmanager/values.yaml create mode 100644 helm-charts/xos-services/att-workflow-driver/.helmignore create mode 100644 helm-charts/xos-services/att-workflow-driver/Chart.yaml create mode 100644 helm-charts/xos-services/att-workflow-driver/templates/_helpers.tpl create mode 100644 helm-charts/xos-services/att-workflow-driver/templates/_tosca.tpl create mode 100644 helm-charts/xos-services/att-workflow-driver/templates/configmap.yaml create mode 100644 helm-charts/xos-services/att-workflow-driver/templates/deployment.yaml create mode 100644 helm-charts/xos-services/att-workflow-driver/values.yaml create mode 100644 helm-charts/xos-services/epc-service/.helmignore create mode 100644 helm-charts/xos-services/epc-service/Chart.yaml create mode 100644 helm-charts/xos-services/epc-service/templates/_helpers.tpl create mode 100644 helm-charts/xos-services/epc-service/templates/_tosca.tpl create mode 100644 helm-charts/xos-services/epc-service/templates/configmap.yaml create mode 100644 helm-charts/xos-services/epc-service/templates/deployment.yaml create mode 100644 helm-charts/xos-services/epc-service/values.yaml create mode 100644 helm-charts/xos-services/exampleservice/.helmignore create mode 100644 helm-charts/xos-services/exampleservice/Chart.yaml create mode 100644 helm-charts/xos-services/exampleservice/files/id_rsa create mode 100644 helm-charts/xos-services/exampleservice/templates/_helpers.tpl create mode 100644 helm-charts/xos-services/exampleservice/templates/_tosca.tpl create mode 100644 helm-charts/xos-services/exampleservice/templates/configmap.yaml create mode 100644 helm-charts/xos-services/exampleservice/templates/deployment.yaml create mode 100644 helm-charts/xos-services/exampleservice/templates/secret.yaml create mode 100644 helm-charts/xos-services/exampleservice/values.yaml create mode 100644 helm-charts/xos-services/fabric-crossconnect/Chart.yaml create mode 100644 helm-charts/xos-services/fabric-crossconnect/templates/_helpers.tpl create mode 100644 helm-charts/xos-services/fabric-crossconnect/templates/_tosca.tpl create mode 100644 helm-charts/xos-services/fabric-crossconnect/templates/configmap.yaml create mode 100644 helm-charts/xos-services/fabric-crossconnect/templates/deployment.yaml create mode 100644 helm-charts/xos-services/fabric-crossconnect/values.yaml create mode 100644 helm-charts/xos-services/fabric/.helmignore create mode 100644 helm-charts/xos-services/fabric/Chart.yaml create mode 100644 helm-charts/xos-services/fabric/templates/_helpers.tpl create mode 100644 helm-charts/xos-services/fabric/templates/_tosca.tpl create mode 100644 helm-charts/xos-services/fabric/templates/configmap.yaml create mode 100644 helm-charts/xos-services/fabric/templates/deployment.yaml create mode 100644 helm-charts/xos-services/fabric/values.yaml create mode 100644 helm-charts/xos-services/hippie-oss/.helmignore create mode 100644 helm-charts/xos-services/hippie-oss/Chart.yaml create mode 100644 helm-charts/xos-services/hippie-oss/templates/_helpers.tpl create mode 100644 helm-charts/xos-services/hippie-oss/templates/_tosca.tpl create mode 100644 helm-charts/xos-services/hippie-oss/templates/configmap.yaml create mode 100644 helm-charts/xos-services/hippie-oss/templates/deployment.yaml create mode 100644 helm-charts/xos-services/hippie-oss/values.yaml create mode 100644 helm-charts/xos-services/hssdb/.helmignore create mode 100644 helm-charts/xos-services/hssdb/Chart.yaml create mode 100644 helm-charts/xos-services/hssdb/files/id_rsa create mode 100644 helm-charts/xos-services/hssdb/templates/_helpers.tpl create mode 100644 helm-charts/xos-services/hssdb/templates/_tosca.tpl create mode 100644 helm-charts/xos-services/hssdb/templates/configmap.yaml create mode 100644 helm-charts/xos-services/hssdb/templates/deployment.yaml create mode 100644 helm-charts/xos-services/hssdb/templates/secret.yaml create mode 100644 helm-charts/xos-services/hssdb/values.yaml create mode 100644 helm-charts/xos-services/internetemulator/.helmignore create mode 100644 helm-charts/xos-services/internetemulator/Chart.yaml create mode 100644 helm-charts/xos-services/internetemulator/files/id_rsa create mode 100644 helm-charts/xos-services/internetemulator/templates/_helpers.tpl create mode 100644 helm-charts/xos-services/internetemulator/templates/_tosca.tpl create mode 100644 helm-charts/xos-services/internetemulator/templates/configmap.yaml create mode 100644 helm-charts/xos-services/internetemulator/templates/deployment.yaml create mode 100644 helm-charts/xos-services/internetemulator/templates/secret.yaml create mode 100644 helm-charts/xos-services/internetemulator/values.yaml create mode 100644 helm-charts/xos-services/k8sepcservice/Chart.yaml create mode 100644 helm-charts/xos-services/k8sepcservice/templates/_helpers.tpl create mode 100644 helm-charts/xos-services/k8sepcservice/templates/_tosca.tpl create mode 100644 helm-charts/xos-services/k8sepcservice/templates/configmap.yaml create mode 100644 helm-charts/xos-services/k8sepcservice/templates/deployment.yaml create mode 100644 helm-charts/xos-services/k8sepcservice/values.yaml create mode 100644 helm-charts/xos-services/kubernetes/Chart.yaml create mode 100644 helm-charts/xos-services/kubernetes/templates/_helpers.tpl create mode 100644 helm-charts/xos-services/kubernetes/templates/configmap.yaml create mode 100644 helm-charts/xos-services/kubernetes/templates/deployment.yaml create mode 100644 helm-charts/xos-services/kubernetes/values.yaml create mode 100644 helm-charts/xos-services/mcord-subscriber/.helmignore create mode 100644 helm-charts/xos-services/mcord-subscriber/Chart.yaml create mode 100644 helm-charts/xos-services/mcord-subscriber/templates/_helpers.tpl create mode 100644 helm-charts/xos-services/mcord-subscriber/templates/_tosca.tpl create mode 100644 helm-charts/xos-services/mcord-subscriber/templates/configmap.yaml create mode 100644 helm-charts/xos-services/mcord-subscriber/templates/job.yaml create mode 100644 helm-charts/xos-services/mcord-subscriber/values.yaml create mode 100644 helm-charts/xos-services/onos-service/.helmignore create mode 100644 helm-charts/xos-services/onos-service/Chart.yaml create mode 100644 helm-charts/xos-services/onos-service/templates/_helpers.tpl create mode 100644 helm-charts/xos-services/onos-service/templates/_tosca.tpl create mode 100644 helm-charts/xos-services/onos-service/templates/configmap.yaml create mode 100644 helm-charts/xos-services/onos-service/templates/deployment.yaml create mode 100644 helm-charts/xos-services/onos-service/values.yaml create mode 100644 helm-charts/xos-services/openstack/.helmignore create mode 100644 helm-charts/xos-services/openstack/Chart.yaml create mode 100644 helm-charts/xos-services/openstack/templates/_helpers.tpl create mode 100644 helm-charts/xos-services/openstack/templates/_tosca.tpl create mode 100644 helm-charts/xos-services/openstack/templates/configmap.yaml create mode 100644 helm-charts/xos-services/openstack/templates/deployment.yaml create mode 100644 helm-charts/xos-services/openstack/values.yaml create mode 100644 helm-charts/xos-services/progran/.helmignore create mode 100644 helm-charts/xos-services/progran/Chart.yaml create mode 100644 helm-charts/xos-services/progran/templates/_helpers.tpl create mode 100644 helm-charts/xos-services/progran/templates/_tosca.tpl create mode 100644 helm-charts/xos-services/progran/templates/configmap.yaml create mode 100644 helm-charts/xos-services/progran/templates/deployment.yaml create mode 100644 helm-charts/xos-services/progran/values.yaml create mode 100644 helm-charts/xos-services/rcord/Chart.yaml create mode 100644 helm-charts/xos-services/rcord/templates/_helpers.tpl create mode 100644 helm-charts/xos-services/rcord/templates/_tosca.tpl create mode 100644 helm-charts/xos-services/rcord/templates/configmap.yaml create mode 100644 helm-charts/xos-services/rcord/templates/deployment.yaml create mode 100644 helm-charts/xos-services/rcord/values.yaml create mode 100644 helm-charts/xos-services/sdncontroller/.helmignore create mode 100644 helm-charts/xos-services/sdncontroller/Chart.yaml create mode 100644 helm-charts/xos-services/sdncontroller/files/id_rsa create mode 100644 helm-charts/xos-services/sdncontroller/templates/_helpers.tpl create mode 100644 helm-charts/xos-services/sdncontroller/templates/_tosca.tpl create mode 100644 helm-charts/xos-services/sdncontroller/templates/configmap.yaml create mode 100644 helm-charts/xos-services/sdncontroller/templates/deployment.yaml create mode 100644 helm-charts/xos-services/sdncontroller/templates/secret.yaml create mode 100644 helm-charts/xos-services/sdncontroller/values.yaml create mode 100644 helm-charts/xos-services/simpleexampleservice/Chart.yaml create mode 100644 helm-charts/xos-services/simpleexampleservice/templates/_helpers.tpl create mode 100644 helm-charts/xos-services/simpleexampleservice/templates/_tosca.tpl create mode 100644 helm-charts/xos-services/simpleexampleservice/templates/configmap.yaml create mode 100644 helm-charts/xos-services/simpleexampleservice/templates/deployment.yaml create mode 100644 helm-charts/xos-services/simpleexampleservice/values.yaml create mode 100644 helm-charts/xos-services/tt-workflow-driver/.helmignore create mode 100644 helm-charts/xos-services/tt-workflow-driver/Chart.yaml create mode 100644 helm-charts/xos-services/tt-workflow-driver/templates/_helpers.tpl create mode 100644 helm-charts/xos-services/tt-workflow-driver/templates/_tosca.tpl create mode 100644 helm-charts/xos-services/tt-workflow-driver/templates/configmap.yaml create mode 100644 helm-charts/xos-services/tt-workflow-driver/templates/deployment.yaml create mode 100644 helm-charts/xos-services/tt-workflow-driver/values.yaml create mode 100644 helm-charts/xos-services/vhss/.helmignore create mode 100644 helm-charts/xos-services/vhss/Chart.yaml create mode 100644 helm-charts/xos-services/vhss/files/id_rsa create mode 100644 helm-charts/xos-services/vhss/templates/_helpers.tpl create mode 100644 helm-charts/xos-services/vhss/templates/_tosca.tpl create mode 100644 helm-charts/xos-services/vhss/templates/configmap.yaml create mode 100644 helm-charts/xos-services/vhss/templates/deployment.yaml create mode 100644 helm-charts/xos-services/vhss/templates/secret.yaml create mode 100644 helm-charts/xos-services/vhss/values.yaml create mode 100644 helm-charts/xos-services/vmme/.helmignore create mode 100644 helm-charts/xos-services/vmme/Chart.yaml create mode 100644 helm-charts/xos-services/vmme/files/id_rsa create mode 100644 helm-charts/xos-services/vmme/templates/_helpers.tpl create mode 100644 helm-charts/xos-services/vmme/templates/_tosca.tpl create mode 100644 helm-charts/xos-services/vmme/templates/configmap.yaml create mode 100644 helm-charts/xos-services/vmme/templates/deployment.yaml create mode 100644 helm-charts/xos-services/vmme/templates/secret.yaml create mode 100644 helm-charts/xos-services/vmme/values.yaml create mode 100644 helm-charts/xos-services/volt/.helmignore create mode 100644 helm-charts/xos-services/volt/Chart.yaml create mode 100644 helm-charts/xos-services/volt/templates/_helpers.tpl create mode 100644 helm-charts/xos-services/volt/templates/_tosca.tpl create mode 100644 helm-charts/xos-services/volt/templates/configmap.yaml create mode 100644 helm-charts/xos-services/volt/templates/deployment.yaml create mode 100644 helm-charts/xos-services/volt/values.yaml create mode 100644 helm-charts/xos-services/vrouter/.helmignore create mode 100644 helm-charts/xos-services/vrouter/Chart.yaml create mode 100644 helm-charts/xos-services/vrouter/templates/_helpers.tpl create mode 100644 helm-charts/xos-services/vrouter/templates/_tosca.tpl create mode 100644 helm-charts/xos-services/vrouter/templates/configmap.yaml create mode 100644 helm-charts/xos-services/vrouter/templates/deployment.yaml create mode 100644 helm-charts/xos-services/vrouter/values.yaml create mode 100644 helm-charts/xos-services/vsg-hw/Chart.yaml create mode 100644 helm-charts/xos-services/vsg-hw/templates/_helpers.tpl create mode 100644 helm-charts/xos-services/vsg-hw/templates/_tosca.tpl create mode 100644 helm-charts/xos-services/vsg-hw/templates/configmap.yaml create mode 100644 helm-charts/xos-services/vsg-hw/templates/deployment.yaml create mode 100644 helm-charts/xos-services/vsg-hw/values.yaml create mode 100644 helm-charts/xos-services/vspgwc/.helmignore create mode 100644 helm-charts/xos-services/vspgwc/Chart.yaml create mode 100644 helm-charts/xos-services/vspgwc/files/id_rsa create mode 100644 helm-charts/xos-services/vspgwc/templates/_helpers.tpl create mode 100644 helm-charts/xos-services/vspgwc/templates/_tosca.tpl create mode 100644 helm-charts/xos-services/vspgwc/templates/configmap.yaml create mode 100644 helm-charts/xos-services/vspgwc/templates/deployment.yaml create mode 100644 helm-charts/xos-services/vspgwc/templates/secret.yaml create mode 100644 helm-charts/xos-services/vspgwc/values.yaml create mode 100644 helm-charts/xos-services/vspgwu/.helmignore create mode 100644 helm-charts/xos-services/vspgwu/Chart.yaml create mode 100644 helm-charts/xos-services/vspgwu/files/id_rsa create mode 100644 helm-charts/xos-services/vspgwu/templates/_helpers.tpl create mode 100644 helm-charts/xos-services/vspgwu/templates/_tosca.tpl create mode 100644 helm-charts/xos-services/vspgwu/templates/configmap.yaml create mode 100644 helm-charts/xos-services/vspgwu/templates/deployment.yaml create mode 100644 helm-charts/xos-services/vspgwu/templates/secret.yaml create mode 100644 helm-charts/xos-services/vspgwu/values.yaml create mode 100644 helm-charts/xos-services/vtn-service/.helmignore create mode 100644 helm-charts/xos-services/vtn-service/Chart.yaml create mode 100644 helm-charts/xos-services/vtn-service/templates/_helpers.tpl create mode 100644 helm-charts/xos-services/vtn-service/templates/_tosca.tpl create mode 100644 helm-charts/xos-services/vtn-service/templates/configmap.yaml create mode 100644 helm-charts/xos-services/vtn-service/templates/deployment.yaml create mode 100644 helm-charts/xos-services/vtn-service/values.yaml create mode 100644 helm-charts/xos-tools/kafkacat/Chart.yaml create mode 100644 helm-charts/xos-tools/kafkacat/templates/NOTES.txt create mode 100644 helm-charts/xos-tools/kafkacat/templates/deployment.yaml create mode 100644 helm-charts/xos-tools/kafkacat/values.yaml create mode 100644 helm-charts/xos-tools/xos-tester/Chart.yaml create mode 100644 helm-charts/xos-tools/xos-tester/templates/NOTES.txt create mode 100644 helm-charts/xos-tools/xos-tester/templates/_helpers.tpl create mode 100644 helm-charts/xos-tools/xos-tester/templates/configmap.yaml create mode 100644 helm-charts/xos-tools/xos-tester/templates/job.yaml create mode 100644 helm-charts/xos-tools/xos-tester/values.yaml create mode 100644 helm-charts/xos-tools/xossh/Chart.yaml create mode 100644 helm-charts/xos-tools/xossh/README.md create mode 100644 helm-charts/xos-tools/xossh/templates/_helpers.tpl create mode 100644 helm-charts/xos-tools/xossh/templates/configmap.yaml create mode 100644 helm-charts/xos-tools/xossh/templates/deployment.yaml create mode 100644 helm-charts/xos-tools/xossh/values.yaml create mode 100755 helm-charts/xos-tools/xossh/xossh-attach.sh diff --git a/helm-charts/README.md b/helm-charts/README.md new file mode 100644 index 0000000..181bf40 --- /dev/null +++ b/helm-charts/README.md @@ -0,0 +1,19 @@ +# Helm charts for CORD + +This repo contains the helm charts for use in the [CORD](https://opencord.org/) +and subsidiary projects. + +Thes charts are published on: + +Please see for more complete +documentation. + +## Changing charts + +When you make changes to charts, please make sure of the following: + +1. Make sure the chart passes a strict lint with `helm lint --strict + `. The `scripts/helmlint.sh` will check all charts. + +2. When you modify a chart, you must increase the version in `Chart.yaml`. You + may also need to update other charts that depend on your chart. diff --git a/helm-charts/VERSION b/helm-charts/VERSION new file mode 100644 index 0000000..f67d718 --- /dev/null +++ b/helm-charts/VERSION @@ -0,0 +1 @@ +6.2.0-dev diff --git a/helm-charts/abstract-olt/.helmignore b/helm-charts/abstract-olt/.helmignore new file mode 100644 index 0000000..f0c1319 --- /dev/null +++ b/helm-charts/abstract-olt/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/helm-charts/abstract-olt/Chart.yaml b/helm-charts/abstract-olt/Chart.yaml new file mode 100644 index 0000000..1f46dfd --- /dev/null +++ b/helm-charts/abstract-olt/Chart.yaml @@ -0,0 +1,21 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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: abstract-olt +description: A Helm chart for SEBA's Abstract OLT layer +icon: https://guide.opencord.org/logos/cord.svg + +version: 0.1.0 +appVersion: latest diff --git a/helm-charts/abstract-olt/templates/_helpers.tpl b/helm-charts/abstract-olt/templates/_helpers.tpl new file mode 100644 index 0000000..ad49f0a --- /dev/null +++ b/helm-charts/abstract-olt/templates/_helpers.tpl @@ -0,0 +1,48 @@ +{{- /* + Copyright 2018-present Open Networking Foundation + + 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. + */ -}} + +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "abstract-olt.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "abstract-olt.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "abstract-olt.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} diff --git a/helm-charts/abstract-olt/templates/deployment.yaml b/helm-charts/abstract-olt/templates/deployment.yaml new file mode 100644 index 0000000..aedc737 --- /dev/null +++ b/helm-charts/abstract-olt/templates/deployment.yaml @@ -0,0 +1,59 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: apps/v1beta2 +kind: Deployment +metadata: + name: {{ template "abstract-olt.fullname" . }} + labels: + app: {{ template "abstract-olt.name" . }} + chart: {{ template "abstract-olt.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + app: {{ template "abstract-olt.name" . }} + release: {{ .Release.Name }} + template: + metadata: + labels: + app: {{ template "abstract-olt.name" . }} + release: {{ .Release.Name }} + {{- with .Values.annotations }} + annotations: +{{ toYaml . | indent 8 }} + {{- end }} + spec: + containers: + - name: {{ .Chart.Name }} + image: "{{ .Values.global.registry }}{{ .Values.image.repository }}:{{ tpl .Values.image.tag . }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + command: ["/app/AbstractOLT", "-log_file", "/dev/stdout"] + resources: +{{ toYaml .Values.resources | indent 12 }} + {{- with .Values.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} diff --git a/helm-charts/abstract-olt/values.yaml b/helm-charts/abstract-olt/values.yaml new file mode 100644 index 0000000..ce34037 --- /dev/null +++ b/helm-charts/abstract-olt/values.yaml @@ -0,0 +1,42 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +replicaCount: 1 + +nameOverride: "" +fullnameOverride: "" + +image: + repository: 'opencord/abstract-olt' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: Always + +global: + registry: '' + +service: + type: NodePort + grpcPort: 31777 + restApiPort: 31778 + +resources: {} + +nodeSelector: {} + +tolerations: [] + +affinity: {} + +annotations: {} diff --git a/helm-charts/bbsim/Chart.yaml b/helm-charts/bbsim/Chart.yaml new file mode 100644 index 0000000..23bd7ac --- /dev/null +++ b/helm-charts/bbsim/Chart.yaml @@ -0,0 +1,20 @@ +# Copyright 2018-present Open Networking Foundation +# +# 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: bbsim +description: Broadband Simulator +icon: https://guide.opencord.org/logos/cord.svg + +version: 1.0.1 +appVersion: 1.0.0 diff --git a/helm-charts/bbsim/templates/NOTES.txt b/helm-charts/bbsim/templates/NOTES.txt new file mode 100644 index 0000000..1359652 --- /dev/null +++ b/helm-charts/bbsim/templates/NOTES.txt @@ -0,0 +1,5 @@ +BBSim deployed with release name: {{ .Release.Name }} + +OLT ID: {{ .Values.olt_id }}, on TCP port: {{ .Values.olt_tcp_port }} +# of PON Ports: {{ .Values.pon_ports }} +ONUs per PON Port: {{ .Values.onus_per_pon_port }} (total: {{ mul .Values.pon_ports .Values.onus_per_pon_port}}) diff --git a/helm-charts/bbsim/templates/_helpers.tpl b/helm-charts/bbsim/templates/_helpers.tpl new file mode 100644 index 0000000..af6ac67 --- /dev/null +++ b/helm-charts/bbsim/templates/_helpers.tpl @@ -0,0 +1,48 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{/* +Expand the name of the chart. +*/}} +{{- define "bbsim.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "bbsim.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "bbsim.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + diff --git a/helm-charts/bbsim/templates/deployment.yaml b/helm-charts/bbsim/templates/deployment.yaml new file mode 100644 index 0000000..8156ed2 --- /dev/null +++ b/helm-charts/bbsim/templates/deployment.yaml @@ -0,0 +1,84 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: {{ template "bbsim.fullname" . }} + namespace: {{ .Values.namespace }} + labels: + app: {{ template "bbsim.name" . }} + chart: {{ template "bbsim.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + app: {{ template "bbsim.name" . }} + release: {{ .Release.Name }} + template: + metadata: + labels: + app: {{ template "bbsim.name" . }} + release: {{ .Release.Name }} + spec: + serviceAccount: {{ .Values.serviceAccountName }} + serviceAccountName: {{ .Values.serviceAccountName }} + containers: + - name: {{ .Chart.Name }} + image: {{ .Values.global.registry }}{{ .Values.images.bbsim.repository }}:{{ tpl .Values.images.bbsim.tag . }} + imagePullPolicy: {{ .Values.images.bbsim.pullPolicy }} + securityContext: + privileged: true + command: [ + "/app/bbsim", + "-n", "{{ .Values.onus_per_pon_port }}", + "-m", "{{ .Values.emulation_mode }}", + "-H", ":{{ .Values.olt_tcp_port }}", + "-id", "{{ .Values.olt_id }}", + "-i", "{{ .Values.pon_ports }}", + "-aw", "{{ .Values.wpa_wait }}", + "-dw", "{{ .Values.dhcp_wait }}", + "-k", "{{ .Values.kafka_broker }}", + ] + ports: + - name: "bbsim-olt-id-{{ .Values.olt_id }}" + containerPort: {{ .Values.olt_tcp_port }} + port: {{ .Values.olt_tcp_port }} + protocol: TCP + env: + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + resources: +{{ toYaml .Values.resources | indent 12 }} + {{- with .Values.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} diff --git a/helm-charts/bbsim/templates/service.yaml b/helm-charts/bbsim/templates/service.yaml new file mode 100644 index 0000000..d63c129 --- /dev/null +++ b/helm-charts/bbsim/templates/service.yaml @@ -0,0 +1,34 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Service +metadata: + name: {{ template "bbsim.fullname" . }} + namespace: {{ .Values.namespace }} + labels: + app: {{ template "bbsim.name" . }} + chart: {{ template "bbsim.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + type: ClusterIP + ports: + - name: "bbsim-olt-id-{{ .Values.olt_id }}" + port: {{ .Values.olt_tcp_port }} + protocol: TCP + selector: + app: {{ template "bbsim.name" . }} + release: {{ .Release.Name }} diff --git a/helm-charts/bbsim/templates/tests/test-bbsim.yaml b/helm-charts/bbsim/templates/tests/test-bbsim.yaml new file mode 100644 index 0000000..93d30d0 --- /dev/null +++ b/helm-charts/bbsim/templates/tests/test-bbsim.yaml @@ -0,0 +1,41 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Pod +metadata: + name: "{{ .Release.Name }}-api-test" + annotations: + "helm.sh/hook": test-success +spec: + restartPolicy: Never + containers: + - name: {{ .Release.Name }}-api-test + image: {{ .Values.images.xos_api_tester.repository }}:{{ .Values.images.xos_api_tester.tag }} + imagePullPolicy: {{ .Values.images.xos_api_tester.pullPolicy }} + volumeMounts: + - name: log-volume + mountPath: /src/cord-api/Tests/Log/ + env: + - name: SERVER_IP + value: 'xos-chameleon' + - name: SERVER_PORT + value: '9101' + command: ["robot", "-d", "Log", "-T", "-v", "number_of_onus:{{ .Values.onus_per_pon_port }}", "WorkflowValidations/BBSIM.robot"] + volumes: + - name: log-volume + hostPath: + path: /tmp/helm_test_bbsim_logs_{{ dateInZone "20060102T030405.00Z" (now) "UTC" }} + type: DirectoryOrCreate diff --git a/helm-charts/bbsim/values.yaml b/helm-charts/bbsim/values.yaml new file mode 100644 index 0000000..26c50c2 --- /dev/null +++ b/helm-charts/bbsim/values.yaml @@ -0,0 +1,70 @@ +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# bbsim values + +# CLI switches passed to bbsim + +# -id option +olt_id: 0 + +# -H option, port number portion +olt_tcp_port: 50060 + +# -i option +pon_ports: 1 + +# -n option +onus_per_pon_port: 16 + +# -m option +emulation_mode: 'both' + +# -a option +wpa_wait: 60 + +# -d option +dhcp_wait: 120 + +# -k option +kafka_broker: 'cord-kafka.default.svc.cluster.local:9092' + +images: + bbsim: + repository: 'voltha/voltha-bbsim' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + xos_api_tester: + repository: 'xosproject/xos-api-tester' + tag: 'master' + pullPolicy: 'Always' + +global: + registry: '' + +namespace: voltha +serviceAccountName: default + +nameOverride: "" +fullnameOverride: "" + +replicaCount: 1 + +resources: {} + +nodeSelector: {} + +tolerations: [] + +affinity: {} \ No newline at end of file diff --git a/helm-charts/configs/onos-debug.yaml b/helm-charts/configs/onos-debug.yaml new file mode 100644 index 0000000..98c7342 --- /dev/null +++ b/helm-charts/configs/onos-debug.yaml @@ -0,0 +1,23 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Enabled debugging for ONOS services +# +# helm install onos -f configs/onos-debug.yaml -n onos + +application_logs: | + log4j.logger.org.opencord.olt = DEBUG + log4j.logger.org.opencord.kafka = DEBUG + log4j.logger.org.opencord.sadis = DEBUG diff --git a/helm-charts/configs/seba-ponsim-latest.yaml b/helm-charts/configs/seba-ponsim-latest.yaml new file mode 100644 index 0000000..bd4ad22 --- /dev/null +++ b/helm-charts/configs/seba-ponsim-latest.yaml @@ -0,0 +1,127 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Values file for deploying SEBA with Ponsim +# Use this file to deploy the 'master' (dev) versions of all services. +# This is mainly useful for testing. + +# voltha +etcd-cluster: + clusterSize: 1 + +# in xos-core chart and other charts with multiple images +images: + xos_core: + tag: 'master' + xos_chameleon: + tag: 'master' + xos_tosca: + tag: 'master' + xos_api_tester: + tag: 'master' + tosca_loader: + tag: 'master' +# ONOS + onos: + repository: 'matteoscandolo/onos' + tag: '1.13.9-rc4' +# VOLTHA + vcore: + tag: 'latest' + vcli: + tag: 'latest' + ofagent: + tag: 'latest' + netconf: + tag: 'latest' + envoy_for_etcd: + tag: 'latest' + alarm_generator: + tag: 'latest' + freeradius: + tag: 'latest' + +# Ponsimv2 + olt: + repository: "voltha/voltha-ponsim" + tag: "latest" + onu: + repository: "voltha/voltha-ponsim" + tag: "latest" + +# in xos-gui sub-chart required by xos-core chart +xos-gui: + images: + xos_gui: + tag: 'master' + xos_ws: + tag: 'master' + +# in seba service chart +fabric: + image: + tag: 'master' +fabric-crossconnect: + image: + tag: 'master' +onos-service: + image: + tag: 'master' +sadis-server: + image: + tag: 'latest' +volt: + image: + tag: 'master' +rcord: + image: + tag: 'master' + +# in base-kubernetes chart +kubernetes: + image: + tag: 'master' + +# in workflow/att-workflow service chart +att-workflow-driver: + image: + tag: 'master' + + # this is mandatory, it's needed to correctly configure the kafka endpoint + kafkaService: cord-kafka + +# in workflow/tt-workflow service chart +tt-workflow-driver: + image: + tag: 'master' + + # this is mandatory, it's needed to correctly configure the kafka endpoint + kafkaService: cord-kafka + +# ONOS applications +aaaAppUrl: "https://oss.sonatype.org/service/local/artifact/maven/redirect?r=snapshots&g=org.opencord&a=aaa&v=1.9.0-SNAPSHOT&e=oar" +aaaAppVersion: "1.9.0.SNAPSHOT" + +sadisAppUrl: "https://oss.sonatype.org/service/local/artifact/maven/redirect?r=snapshots&g=org.opencord&a=sadis-app&v=3.1.0-SNAPSHOT&e=oar" +sadisAppVersion: "3.1.0.SNAPSHOT" + +dhcpl2relayAppUrl: "https://oss.sonatype.org/service/local/artifact/maven/redirect?r=snapshots&g=org.opencord&a=dhcpl2relay&v=1.6.0-SNAPSHOT&e=oar" +dhcpl2relayAppVersion: "1.6.0.SNAPSHOT" + +oltAppUrl: "https://oss.sonatype.org/service/local/artifact/maven/redirect?r=snapshots&g=org.opencord&a=olt-app&v=3.0.1-SNAPSHOT&e=oar" +oltAppVersion: "3.0.1.SNAPSHOT" + +kafkaAppUrl: "https://oss.sonatype.org/service/local/artifact/maven/redirect?r=snapshots&g=org.opencord&a=kafka&v=1.1.0-SNAPSHOT&e=oar" +kafkaAppVersion: "1.1.0.SNAPSHOT" diff --git a/helm-charts/configs/seba-ponsim-voltha-1.6.yaml b/helm-charts/configs/seba-ponsim-voltha-1.6.yaml new file mode 100644 index 0000000..b764dda --- /dev/null +++ b/helm-charts/configs/seba-ponsim-voltha-1.6.yaml @@ -0,0 +1,48 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Values file for deploying SEBA with Ponsim +# Use this file to deploy the service versions speecified in the Helm charts. + +# voltha +etcd-cluster: + clusterSize: 1 + +images: +# VOLTHA + vcore: + tag: 'voltha-1.6' + vcli: + tag: 'voltha-1.6' + ofagent: + tag: 'voltha-1.6' + netconf: + tag: 'voltha-1.6' + envoy_for_etcd: + tag: 'voltha-1.6' + alarm_generator: + tag: 'voltha-1.6' +# Ponsimv2 + olt: + tag: "voltha-1.6" + onu: + tag: "voltha-1.6" + rg: + tag: "voltha-1.6" + +# in workflow/att-workflow service chart +att-workflow-driver: + # this is mandatory, it's needed to correctly configure the kafka endpoint + kafkaService: cord-kafka diff --git a/helm-charts/configs/seba-ponsim.yaml b/helm-charts/configs/seba-ponsim.yaml new file mode 100644 index 0000000..69bd0e0 --- /dev/null +++ b/helm-charts/configs/seba-ponsim.yaml @@ -0,0 +1,41 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Values file for deploying SEBA with Ponsim +# Use this file to deploy the service versions speecified in the Helm charts. + +# voltha +etcd-cluster: + clusterSize: 1 + +# in workflow/att-workflow service chart +att-workflow-driver: + # this is mandatory, it's needed to correctly configure the kafka endpoint + kafkaService: cord-kafka + +# in workflow/tt-workflow service chart +tt-workflow-driver: + image: + repository: andybavier/test-image-synchronizer + tag: tt-workflow-driver + + # this is mandatory, it's needed to correctly configure the kafka endpoint + kafkaService: cord-kafka + +# in mininet chart +vlanMatchDepth: 1 + +# in ponsim-pod chart +bandwidthProfiles: False diff --git a/helm-charts/configs/siab-v1.0.0.yaml b/helm-charts/configs/siab-v1.0.0.yaml new file mode 100644 index 0000000..9a78dbf --- /dev/null +++ b/helm-charts/configs/siab-v1.0.0.yaml @@ -0,0 +1,27 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Values file for deploying SEBA with Ponsim +# Use this file to deploy the service versions speecified in the Helm charts. + +# For building released version of seba +voltha: + etcd-cluster: + clusterSize: 1 + +onosOpenflowSvc: "cord-platform-onos-openflow.default.svc.cluster.local" + +sadis-server: + kafkaBroker: "cord-platform-kafka:9092" diff --git a/helm-charts/dhcp-server/Chart.yaml b/helm-charts/dhcp-server/Chart.yaml new file mode 100644 index 0000000..6a1ea18 --- /dev/null +++ b/helm-charts/dhcp-server/Chart.yaml @@ -0,0 +1,17 @@ +# Copyright 2017-present Open Networking Foundation +# +# 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: dhcp-server +version: 1.0.0 +appVersion: 'latest' diff --git a/helm-charts/dhcp-server/templates/_helpers.tpl b/helm-charts/dhcp-server/templates/_helpers.tpl new file mode 100644 index 0000000..bcbd46d --- /dev/null +++ b/helm-charts/dhcp-server/templates/_helpers.tpl @@ -0,0 +1,25 @@ + +{{- /* + Copyright 2017-present Open Networking Foundation + + 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. + */ -}} + +{{- define "dhcp-server.release_labels" }} +app: {{ printf "%s-%s" .Release.Name .Chart.Name | trunc 63 }} +version: {{ .Chart.Version }} +release: {{ .Release.Name }} +{{- end }} +{{- define "dhcp-server.full_name" -}} +{{- printf "%s-%s" .Release.Name .Chart.Name | trunc 63 -}} +{{- end -}} diff --git a/helm-charts/dhcp-server/templates/configmap.yaml b/helm-charts/dhcp-server/templates/configmap.yaml new file mode 100644 index 0000000..8436ab6 --- /dev/null +++ b/helm-charts/dhcp-server/templates/configmap.yaml @@ -0,0 +1,22 @@ +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: dhcp-server + labels: + {{- include "dhcp-server.release_labels" . | indent 4 }} +data: + config: | {{ .Values.config | indent 4 }} diff --git a/helm-charts/dhcp-server/templates/deployment.yaml b/helm-charts/dhcp-server/templates/deployment.yaml new file mode 100644 index 0000000..4a63279 --- /dev/null +++ b/helm-charts/dhcp-server/templates/deployment.yaml @@ -0,0 +1,48 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: dhcp-server + labels: + app: dhcp-server +spec: + replicas: 1 + template: + metadata: + labels: + app: dhcp-server + spec: + containers: + - name: dhcp-server + image: {{ .Values.global.registry }}{{ .Values.image.repository }}:{{ tpl .Values.image.tag . }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + #command: ["/bin/bash", "-", "sleep 86400"] + ports: + - containerPort: 67 + port: 67 + protocol: UDP + volumeMounts: + - name: dhcp-server + mountPath: /data/dhcpd.conf + subPath: mymounts/dhcpd.conf + volumes: + - name: dhcp-server + configMap: + name: dhcp-server + items: + - key: config + path: mymounts/dhcpd.conf diff --git a/helm-charts/dhcp-server/templates/dhcp-service.yaml b/helm-charts/dhcp-server/templates/dhcp-service.yaml new file mode 100644 index 0000000..6bc8025 --- /dev/null +++ b/helm-charts/dhcp-server/templates/dhcp-service.yaml @@ -0,0 +1,29 @@ +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Service +metadata: + name: "dhcp-server" + labels: + {{- include "dhcp-server.release_labels" . | indent 4 }} +spec: + type: ClusterIP + ports: + - port: 67 + name: dhcp + targetPort: 67 + protocol: UDP + selector: + app: "dhcp-server" diff --git a/helm-charts/dhcp-server/values.yaml b/helm-charts/dhcp-server/values.yaml new file mode 100644 index 0000000..7ac1ba7 --- /dev/null +++ b/helm-charts/dhcp-server/values.yaml @@ -0,0 +1,34 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +# helm install dhcp-server -n dhcp-server + +image: + repository: 'networkboot/dhcpd' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + +global: + registry: '' + +config: | + + subnet 10.233.0.0 netmask 255.255.0.0 { + range 10.233.0.1 10.233.0.2; + } + subnet 10.200.0.0 netmask 255.255.0.0 { + range 10.200.0.1 10.200.0.253; + option routers 10.200.0.254; + } diff --git a/helm-charts/etcd-cluster/.helmignore b/helm-charts/etcd-cluster/.helmignore new file mode 100644 index 0000000..f0c1319 --- /dev/null +++ b/helm-charts/etcd-cluster/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/helm-charts/etcd-cluster/Chart.yaml b/helm-charts/etcd-cluster/Chart.yaml new file mode 100644 index 0000000..77a0f4d --- /dev/null +++ b/helm-charts/etcd-cluster/Chart.yaml @@ -0,0 +1,19 @@ +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +appVersion: "0.9.2" +description: Create an etcd-cluster using etcd-operator provided CRD +name: etcd-cluster +version: 0.1.2 diff --git a/helm-charts/etcd-cluster/templates/etcd-cluster-service.yaml b/helm-charts/etcd-cluster/templates/etcd-cluster-service.yaml new file mode 100644 index 0000000..08f294e --- /dev/null +++ b/helm-charts/etcd-cluster/templates/etcd-cluster-service.yaml @@ -0,0 +1,30 @@ +{{- if .Values.etcdNodePort -}} +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Service +metadata: + name: {{ .Values.clusterName }}-external +spec: + type: NodePort + ports: + - port: 2379 + targetPort: 2379 + nodePort: {{ .Values.etcdNodePort }} + protocol: TCP + selector: + app: "etcd" +{{- end -}} diff --git a/helm-charts/etcd-cluster/templates/etcd-cluster.yaml b/helm-charts/etcd-cluster/templates/etcd-cluster.yaml new file mode 100644 index 0000000..281227f --- /dev/null +++ b/helm-charts/etcd-cluster/templates/etcd-cluster.yaml @@ -0,0 +1,30 @@ +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: "etcd.database.coreos.com/v1beta2" +kind: "EtcdCluster" +metadata: + name: {{ quote .Values.clusterName }} +spec: + size: {{ .Values.clusterSize }} + pod: + resources: + limits: + memory: {{ .Values.memoryLimit }} + etcdEnv: + - name: ETCD_AUTO_COMPACTION_RETENTION + value: {{ quote .Values.autoCompactionRetention }} + busyboxImage: {{ .Values.global.registry }}{{ .Values.images.busybox.repository }}:{{ tpl .Values.images.busybox.tag . }} + version: {{ tpl .Values.images.etcd.tag . }} + repository: {{ .Values.global.registry }}{{ .Values.images.etcd.repository }} diff --git a/helm-charts/etcd-cluster/values.yaml b/helm-charts/etcd-cluster/values.yaml new file mode 100644 index 0000000..9bbab01 --- /dev/null +++ b/helm-charts/etcd-cluster/values.yaml @@ -0,0 +1,37 @@ +# Copyright 2017-present Open Networking Foundation +# +# 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. + +# Default values for etcd-cluster. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +clusterName: "etcd-cluster" +clusterSize: 3 +memoryLimit: 1024Mi +autoCompactionRetention: "12" + +# expose the etcd-cluster as a nodePort +# etcdNodePort: 32379 +etcdNodePort: "" + +images: + etcd: + repository: "quay.io/coreos/etcd" + tag: "v3.2.18" + busybox: + repository: "busybox" + tag: "1.28.1-glibc" + +global: + registry: "" diff --git a/helm-charts/examples/add-trap-flow.json b/helm-charts/examples/add-trap-flow.json new file mode 100644 index 0000000..14ebaa9 --- /dev/null +++ b/helm-charts/examples/add-trap-flow.json @@ -0,0 +1,30 @@ + { + "flows": [ + { + "priority": 40000, + "timeout": 0, + "isPermanent": true, + "deviceId": "of:0000aabbccddeeff", + "treatment": { + "instructions": [ + { + "type": "OUTPUT", + "port": "CONTROLLER" + } + ] + }, + "selector": { + "criteria": [ + { + "type": "ETH_TYPE", + "ethType": "0x888e" + }, + { + "type": "IN_PORT", + "port": "128" + } + ] + } + } + ] + } \ No newline at end of file diff --git a/helm-charts/examples/add-trap-flow.sh b/helm-charts/examples/add-trap-flow.sh new file mode 100755 index 0000000..e120404 --- /dev/null +++ b/helm-charts/examples/add-trap-flow.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# add-trap-flow.sh +# Adds the EAPOL trap flow needed by Ponsim. In VOLTHA master, Ponsim has the wrong EAPOL trap flow loaded by the adapter. + +http -a karaf:karaf POST http://127.0.0.1:30120/onos/v1/flows < $( dirname "$0" )/add-trap-flow.json diff --git a/helm-charts/examples/adminuser-values.yaml b/helm-charts/examples/adminuser-values.yaml new file mode 100644 index 0000000..bdad17b --- /dev/null +++ b/helm-charts/examples/adminuser-values.yaml @@ -0,0 +1,49 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Override XOS admin user and password values set in values.yaml +# +# helm install -f examples/adminuser-values.yaml xos-core -n xos-core +# helm install -f examples/adminuser-values.yaml xos-profiles/rcord-lite -n rcord-lite + +xosAdminUser: &adminuser "cordadmin@foobar.com" +xosAdminPassword: &adminpass "AVerySecurePassword" + +# Update the username / password for all the services +addressmanager: + xosAdminUser: *adminuser + xosAdminPassword: *adminpass +fabric: + xosAdminUser: *adminuser + xosAdminPassword: *adminpass +onos-service: + xosAdminUser: *adminuser + xosAdminPassword: *adminpass +volt: + xosAdminUser: *adminuser + xosAdminPassword: *adminpass +vsg-hw: + xosAdminUser: *adminuser + xosAdminPassword: *adminpass +kubernetes: + xosAdminUser: *adminuser + xosAdminPassword: *adminpass +exampleservice: + xosAdminUser: *adminuser + xosAdminPassword: *adminpass +simpleexampleservice: + xosAdminUser: *adminuser + xosAdminPassword: *adminpass \ No newline at end of file diff --git a/helm-charts/examples/api-test-images.yaml b/helm-charts/examples/api-test-images.yaml new file mode 100644 index 0000000..ac26cd9 --- /dev/null +++ b/helm-charts/examples/api-test-images.yaml @@ -0,0 +1,37 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Whitelist for use with imagebuilder, only images needed for api-test + +docker_image_whitelist: +- xosproject/chameleon +- xosproject/xos-base +- xosproject/xos-client +- xosproject/xos-core +- xosproject/xos-libraries +- xosproject/xos-tosca +- xosproject/xos-synchronizer-base +- xosproject/rcord-synchronizer +- xosproject/volt-synchronizer +- xosproject/vtn-synchronizer +- xosproject/onos-synchronizer +- xosproject/addressmanager-synchronizer +- xosproject/vsg-hw-synchronizer +- xosproject/kubernetes-synchronizer +- xosproject/fabric-synchronizer +- xosproject/fabric-crossconnect-synchronizer +- xosproject/xos-api-tester +- postgres + diff --git a/helm-charts/examples/api-test-values.yaml b/helm-charts/examples/api-test-values.yaml new file mode 100644 index 0000000..0fb8ba4 --- /dev/null +++ b/helm-charts/examples/api-test-values.yaml @@ -0,0 +1,27 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Values file for API tests +# +# The test process is to install minikube directly on a machine with docker +# installed (`--vm-driver=none`) then use imagebuilder to build images with +# candidate tags into that local docker registry, and run the tests. + +# shared by xos-core, rcord-lite, etc. +imagePullPolicy: 'IfNotPresent' + +# xos-core +xos-gui: + enabled: false diff --git a/helm-charts/examples/bbsim-16.yaml b/helm-charts/examples/bbsim-16.yaml new file mode 100644 index 0000000..9714ed1 --- /dev/null +++ b/helm-charts/examples/bbsim-16.yaml @@ -0,0 +1,430 @@ +# Copyright 2017-present Open Networking Foundation +# +# 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. + +# Example TOSCA to create a BBSim OLT and 16 ONUs with SiaB +# Load into xos-tosca with: +# curl -H "xos-username: admin@opencord.org" -H "xos-password: letmein" -X POST --data-binary @bbsim-16.yaml http://127.0.0.1:30007/run + +tosca_definitions_version: tosca_simple_yaml_1_0 +imports: + - custom_types/voltservice.yaml + - custom_types/oltdevice.yaml + - custom_types/onudevice.yaml + - custom_types/attworkflowdriverservice.yaml + - custom_types/attworkflowdriverwhitelistentry.yaml + - custom_types/rcordsubscriber.yaml + +description: Create a simulated OLT Device in VOLTHA +topology_template: + node_templates: + + service#volt: + type: tosca.nodes.VOLTService + properties: + name: volt + must-exist: true + + olt_device: + type: tosca.nodes.OLTDevice + properties: + name: BBSIM_OLT + device_type: openolt + host: bbsim.voltha.svc + port: 50060 + switch_datapath_id: of:0000000000000002 + switch_port: "3" + outer_tpid: "0x8100" + uplink: "65536" + nas_id: "NAS_ID" + serial_number: "bbsim.voltha.svc:50060" + requirements: + - volt_service: + node: service#volt + relationship: tosca.relationships.BelongsToOne + + # Whitelist + service#att: + type: tosca.nodes.AttWorkflowDriverService + properties: + name: att-workflow-driver + must-exist: true + + BBSM00000100: + type: tosca.nodes.AttWorkflowDriverWhiteListEntry + properties: + serial_number: BBSM00000100 + pon_port_id: 536870913 + device_id: of:0000626273696d76 + requirements: + - owner: + node: service#att + relationship: tosca.relationships.BelongsToOne + + BBSM00000101: + type: tosca.nodes.AttWorkflowDriverWhiteListEntry + properties: + serial_number: BBSM00000101 + pon_port_id: 536870913 + device_id: of:0000626273696d76 + requirements: + - owner: + node: service#att + relationship: tosca.relationships.BelongsToOne + + BBSM00000102: + type: tosca.nodes.AttWorkflowDriverWhiteListEntry + properties: + serial_number: BBSM00000102 + pon_port_id: 536870913 + device_id: of:0000626273696d76 + requirements: + - owner: + node: service#att + relationship: tosca.relationships.BelongsToOne + + BBSM00000103: + type: tosca.nodes.AttWorkflowDriverWhiteListEntry + properties: + serial_number: BBSM00000103 + pon_port_id: 536870913 + device_id: of:0000626273696d76 + requirements: + - owner: + node: service#att + relationship: tosca.relationships.BelongsToOne + + BBSM00000104: + type: tosca.nodes.AttWorkflowDriverWhiteListEntry + properties: + serial_number: BBSM00000104 + pon_port_id: 536870913 + device_id: of:0000626273696d76 + requirements: + - owner: + node: service#att + relationship: tosca.relationships.BelongsToOne + + BBSM00000105: + type: tosca.nodes.AttWorkflowDriverWhiteListEntry + properties: + serial_number: BBSM00000105 + pon_port_id: 536870913 + device_id: of:0000626273696d76 + requirements: + - owner: + node: service#att + relationship: tosca.relationships.BelongsToOne + + BBSM00000106: + type: tosca.nodes.AttWorkflowDriverWhiteListEntry + properties: + serial_number: BBSM00000106 + pon_port_id: 536870913 + device_id: of:0000626273696d76 + requirements: + - owner: + node: service#att + relationship: tosca.relationships.BelongsToOne + + BBSM00000107: + type: tosca.nodes.AttWorkflowDriverWhiteListEntry + properties: + serial_number: BBSM00000107 + pon_port_id: 536870913 + device_id: of:0000626273696d76 + requirements: + - owner: + node: service#att + relationship: tosca.relationships.BelongsToOne + + BBSM00000108: + type: tosca.nodes.AttWorkflowDriverWhiteListEntry + properties: + serial_number: BBSM00000108 + pon_port_id: 536870913 + device_id: of:0000626273696d76 + requirements: + - owner: + node: service#att + relationship: tosca.relationships.BelongsToOne + + BBSM00000109: + type: tosca.nodes.AttWorkflowDriverWhiteListEntry + properties: + serial_number: BBSM00000109 + pon_port_id: 536870913 + device_id: of:0000626273696d76 + requirements: + - owner: + node: service#att + relationship: tosca.relationships.BelongsToOne + + BBSM0000010a: + type: tosca.nodes.AttWorkflowDriverWhiteListEntry + properties: + serial_number: BBSM0000010a + pon_port_id: 536870913 + device_id: of:0000626273696d76 + requirements: + - owner: + node: service#att + relationship: tosca.relationships.BelongsToOne + + BBSM0000010b: + type: tosca.nodes.AttWorkflowDriverWhiteListEntry + properties: + serial_number: BBSM0000010b + pon_port_id: 536870913 + device_id: of:0000626273696d76 + requirements: + - owner: + node: service#att + relationship: tosca.relationships.BelongsToOne + + BBSM0000010c: + type: tosca.nodes.AttWorkflowDriverWhiteListEntry + properties: + serial_number: BBSM0000010c + pon_port_id: 536870913 + device_id: of:0000626273696d76 + requirements: + - owner: + node: service#att + relationship: tosca.relationships.BelongsToOne + + BBSM0000010d: + type: tosca.nodes.AttWorkflowDriverWhiteListEntry + properties: + serial_number: BBSM0000010d + pon_port_id: 536870913 + device_id: of:0000626273696d76 + requirements: + - owner: + node: service#att + relationship: tosca.relationships.BelongsToOne + + BBSM0000010e: + type: tosca.nodes.AttWorkflowDriverWhiteListEntry + properties: + serial_number: BBSM0000010e + pon_port_id: 536870913 + device_id: of:0000626273696d76 + requirements: + - owner: + node: service#att + relationship: tosca.relationships.BelongsToOne + + BBSM0000010f: + type: tosca.nodes.AttWorkflowDriverWhiteListEntry + properties: + serial_number: BBSM0000010f + pon_port_id: 536870913 + device_id: of:0000626273696d76 + requirements: + - owner: + node: service#att + relationship: tosca.relationships.BelongsToOne + + # Pre-provision the subscriber + bbsim_subscriber_0: + type: tosca.nodes.RCORDSubscriber + properties: + name: Sub_BBSM00000100 + status: pre-provisioned + c_tag: 900 + s_tag: 999 + onu_device: BBSM00000100 + circuit_id: circuit0 + remote_id: remote0 + nas_port_id: PON 2/1/01/1:1.1.0 + + bbsim_subscriber_1: + type: tosca.nodes.RCORDSubscriber + properties: + name: Sub_BBSM00000101 + status: pre-provisioned + c_tag: 901 + s_tag: 999 + onu_device: BBSM00000101 + circuit_id: circuit1 + remote_id: remote1 + nas_port_id: PON 2/1/01/1:1.1.1 + + bbsim_subscriber_2: + type: tosca.nodes.RCORDSubscriber + properties: + name: Sub_BBSM00000102 + status: pre-provisioned + c_tag: 902 + s_tag: 999 + onu_device: BBSM00000102 + circuit_id: circuit2 + remote_id: remote2 + nas_port_id: PON 2/1/01/1:1.1.2 + + bbsim_subscriber_3: + type: tosca.nodes.RCORDSubscriber + properties: + name: Sub_BBSM00000103 + status: pre-provisioned + c_tag: 903 + s_tag: 999 + onu_device: BBSM00000103 + circuit_id: circuit3 + remote_id: remote3 + nas_port_id: PON 2/1/01/1:1.1.3 + + bbsim_subscriber_4: + type: tosca.nodes.RCORDSubscriber + properties: + name: Sub_BBSM00000104 + status: pre-provisioned + c_tag: 904 + s_tag: 999 + onu_device: BBSM00000104 + circuit_id: circuit4 + remote_id: remote4 + nas_port_id: PON 2/1/01/1:1.1.4 + + bbsim_subscriber_5: + type: tosca.nodes.RCORDSubscriber + properties: + name: Sub_BBSM00000105 + status: pre-provisioned + c_tag: 905 + s_tag: 999 + onu_device: BBSM00000105 + circuit_id: circuit5 + remote_id: remote5 + nas_port_id: PON 2/1/01/1:1.1.5 + + bbsim_subscriber_6: + type: tosca.nodes.RCORDSubscriber + properties: + name: Sub_BBSM00000106 + status: pre-provisioned + c_tag: 906 + s_tag: 999 + onu_device: BBSM00000106 + circuit_id: circuit6 + remote_id: remote6 + nas_port_id: PON 2/1/01/1:1.1.6 + + bbsim_subscriber_7: + type: tosca.nodes.RCORDSubscriber + properties: + name: Sub_BBSM00000107 + status: pre-provisioned + c_tag: 907 + s_tag: 999 + onu_device: BBSM00000107 + circuit_id: circuit7 + remote_id: remote7 + nas_port_id: PON 2/1/01/1:1.1.7 + + bbsim_subscriber_8: + type: tosca.nodes.RCORDSubscriber + properties: + name: Sub_BBSM00000108 + status: pre-provisioned + c_tag: 908 + s_tag: 999 + onu_device: BBSM00000108 + circuit_id: circuit8 + remote_id: remote8 + nas_port_id: PON 2/1/01/1:1.1.8 + + bbsim_subscriber_9: + type: tosca.nodes.RCORDSubscriber + properties: + name: Sub_BBSM00000109 + status: pre-provisioned + c_tag: 909 + s_tag: 999 + onu_device: BBSM00000109 + circuit_id: circuit9 + remote_id: remote9 + nas_port_id: PON 2/1/01/1:1.1.9 + + bbsim_subscriber_a: + type: tosca.nodes.RCORDSubscriber + properties: + name: Sub_BBSM0000010a + status: pre-provisioned + c_tag: 910 + s_tag: 999 + onu_device: BBSM0000010a + circuit_id: circuit10a + remote_id: remote10a + nas_port_id: PON 2/1/01/1:1.1.10a + + bbsim_subscriber_b: + type: tosca.nodes.RCORDSubscriber + properties: + name: Sub_BBSM0000010b + status: pre-provisioned + c_tag: 911 + s_tag: 999 + onu_device: BBSM0000010b + circuit_id: circuit10b + remote_id: remote10b + nas_port_id: PON 2/1/01/1:1.1.10b + + bbsim_subscriber_c: + type: tosca.nodes.RCORDSubscriber + properties: + name: Sub_BBSM0000010c + status: pre-provisioned + c_tag: 912 + s_tag: 999 + onu_device: BBSM0000010c + circuit_id: circuit10c + remote_id: remote10c + nas_port_id: PON 2/1/01/1:1.1.10c + + bbsim_subscriber_d: + type: tosca.nodes.RCORDSubscriber + properties: + name: Sub_BBSM0000010d + status: pre-provisioned + c_tag: 913 + s_tag: 999 + onu_device: BBSM0000010d + circuit_id: circuit10d + remote_id: remote10d + nas_port_id: PON 2/1/01/1:1.1.10d + + bbsim_subscriber_e: + type: tosca.nodes.RCORDSubscriber + properties: + name: Sub_BBSM0000010e + status: pre-provisioned + c_tag: 914 + s_tag: 999 + onu_device: BBSM0000010e + circuit_id: circuit10e + remote_id: remote10e + nas_port_id: PON 2/1/01/1:1.1.10e + + bbsim_subscriber_f: + type: tosca.nodes.RCORDSubscriber + properties: + name: Sub_BBSM0000010f + status: pre-provisioned + c_tag: 915 + s_tag: 999 + onu_device: BBSM0000010f + circuit_id: circuit10f + remote_id: remote10f + nas_port_id: PON 2/1/01/1:1.1.10f diff --git a/helm-charts/examples/bbsim-dhcp.yaml b/helm-charts/examples/bbsim-dhcp.yaml new file mode 100644 index 0000000..89f14aa --- /dev/null +++ b/helm-charts/examples/bbsim-dhcp.yaml @@ -0,0 +1,58 @@ +# Copyright 2017-present Open Networking Foundation +# +# 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. + +# Example TOSCA to configure dhcpl2relay when running BBSim standalone with SiaB +# Load into xos-tosca with: +# curl -H "xos-username: admin@opencord.org" -H "xos-password: letmein" -X POST --data-binary @bbsim-dhcp.yaml http://127.0.0.1:30007/run + +tosca_definitions_version: tosca_simple_yaml_1_0 +imports: + - custom_types/bngportmapping.yaml + - custom_types/onosapp.yaml + - custom_types/serviceinstanceattribute.yaml + +description: Create a simulated OLT Device in VOLTHA +topology_template: + node_templates: + + # map the BNG to a port + # this is not really used by BBSIM as there's no data-plane traffic, + # but it's required by NEM to configure the crossconnect + bngmapping: + type: tosca.nodes.BNGPortMapping + properties: + s_tag: any + switch_port: 1 + + # DHCP L2 Relay config + onos_app#dhcpl2relay: + type: tosca.nodes.ONOSApp + properties: + name: dhcpl2relay + must-exist: true + + dhcpl2relay-config-attr: + type: tosca.nodes.ServiceInstanceAttribute + properties: + name: /onos/v1/network/configuration/apps/org.opencord.dhcpl2relay + value: > + { + "dhcpl2relay" : { + "useOltUplinkForServerPktInOut" : true + } + } + requirements: + - service_instance: + node: onos_app#dhcpl2relay + relationship: tosca.relationships.BelongsToOne diff --git a/helm-charts/examples/compute-nodes.yaml b/helm-charts/examples/compute-nodes.yaml new file mode 100644 index 0000000..8bdc80b --- /dev/null +++ b/helm-charts/examples/compute-nodes.yaml @@ -0,0 +1,33 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Information for the cluster's OpenStack compute nodes + +computeNodes: + master: + name: node0.opencord.org + bridgeId: of:00000000abcdef01 + dataPlaneIntf: fabric + dataPlaneIp: 10.6.1.1/24 + node1: + name: node1.opencord.org + bridgeId: of:00000000abcdef02 + dataPlaneIntf: fabric + dataPlaneIp: 10.6.1.2/24 + node2: + name: node2.opencord.org + bridgeId: of:00000000abcdef03 + dataPlaneIntf: fabric + dataPlaneIp: 10.6.1.3/24 \ No newline at end of file diff --git a/helm-charts/examples/fabric-values.yaml b/helm-charts/examples/fabric-values.yaml new file mode 100644 index 0000000..2866f05 --- /dev/null +++ b/helm-charts/examples/fabric-values.yaml @@ -0,0 +1,43 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Override null fabric configuration set in rcord-lite's values.yaml +# +# helm install -f examples/fabric-values.yaml xos-profiles/rcord-lite -n rcord-lite + +fabricNetworkConfigJson: &netcfg | + { + "devices": { + }, + "ports": { + }, + "apps" : { + "org.onosproject.segmentrouting" : { + "segmentrouting" : { + "vRouterMacs" : [ "a4:23:05:06:01:01" ] + } + } + } + } + +toscaRecipes: + fabricService: + topology_template: + node_templates: + serviceattribute#fabric_network_cfg_json: + properties: + name: rest_onos/v1/network/configuration/ + value: *netcfg diff --git a/helm-charts/examples/filter-images.yaml b/helm-charts/examples/filter-images.yaml new file mode 100644 index 0000000..9f28d3e --- /dev/null +++ b/helm-charts/examples/filter-images.yaml @@ -0,0 +1,67 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Whitelist for use with imagebuilder + +docker_image_whitelist: +- nginx +- postgres + +# xos-core images +- xosproject/chameleon +- xosproject/xos-base +- xosproject/xos-client +- xosproject/xos-core +- xosproject/xos-gui +- xosproject/xos-gui-builder +- xosproject/xos-libraries +- xosproject/xos-tosca +- xosproject/xos-ws +- xosproject/xos-synchronizer-base + +# rcord images +- xosproject/rcord-synchronizer +- xosproject/volt-synchronizer +- xosproject/vrouter-synchronizer +- xosproject/onos-synchronizer +- xosproject/addressmanager-synchronizer +- xosproject/vsg-hw-synchronizer +- xosproject/fabric-synchronizer +- xosproject/fabric-crossconnect-synchronizer +- xosproject/att-workflow-driver-synchronizer + +# base-openstack images +- xosproject/openstack-synchronizer +- xosproject/vtn-synchronizer + +# mcord images +- "xosproject/vmme-synchronizer" +- "xosproject/vspgwc-synchronizer" +- "xosproject/vspgwu-synchronizer" +- "xosproject/vhss-synchronizer" +- "xosproject/hssdb-synchronizer" +- "xosproject/internetemulator-synchronizer" +- "xosproject/sdncontroller-synchronizer" +- "xosproject/vepc-synchronizer" +- "xosproject/mcord-synchronizer" +- "xosproject/progran-synchronizer" + +# others +- xosproject/hippie-oss-synchronizer +- xosproject/kubernetes-synchronizer +- xosproject/exampleservice-synchronizer +- xosproject/simpleexampleservice-synchronizer +- xosproject/xos-api-tester +- xosproject/tosca-loader diff --git a/helm-charts/examples/image-tag-candidate.yaml b/helm-charts/examples/image-tag-candidate.yaml new file mode 100644 index 0000000..6c023f0 --- /dev/null +++ b/helm-charts/examples/image-tag-candidate.yaml @@ -0,0 +1,124 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Set all image tags to "candidate" to use locally built images +image: + tag: 'candidate' + +# in xos-core chart and other charts with multiple images +images: + xos_core: + tag: 'candidate' + xos_chameleon: + tag: 'candidate' + xos_tosca: + tag: 'candidate' + xos_api_tester: + tag: 'candidate' + tosca_loader: + tag: 'candidate' + +# in xos-gui sub-chart required by xos-core chart +xos-gui: + images: + xos_gui: + tag: 'candidate' + xos_ws: + tag: 'candidate' + +# in RCORD service chart +addressmanager: + image: + tag: 'candidate' +att-workflow-driver: + image: + tag: 'candidate' +fabric: + image: + tag: 'candidate' +fabric-crossconnect: + image: + tag: 'candidate' +onos-service: + image: + tag: 'candidate' +volt: + image: + tag: 'candidate' +vsg-hw: + image: + tag: 'candidate' +vrouter: + image: + tag: 'candidate' +rcord: + image: + tag: 'candidate' + +# in BASE-OPENSTACK chart +openstack: + image: + tag: 'candidate' + +vtn-service: + image: + tag: 'candidate' + +# in MCORD +vmme: + image: + tag: 'candidate' +vspgwc: + image: + tag: 'candidate' +vspgwu: + image: + tag: 'candidate' +vhss: + image: + tag: 'candidate' +hssdb: + image: + tag: 'candidate' +internetemulator: + image: + tag: 'candidate' +sdncontroller: + image: + tag: 'candidate' +epc-service: + image: + tag: 'candidate' +k8spcservice: + image: + tag: 'candidate' +mcord-subscriber: + image: + tag: 'candidate' +progran: + image: + tag: 'candidate' + +# others +kubernetes: + image: + tag: 'candidate' +exampleservice: + image: + tag: 'candidate' +simpleexampleservice: + image: + tag: 'candidate' + diff --git a/helm-charts/examples/imagePullPolicy-IfNotPresent.yaml b/helm-charts/examples/imagePullPolicy-IfNotPresent.yaml new file mode 100644 index 0000000..8e8de99 --- /dev/null +++ b/helm-charts/examples/imagePullPolicy-IfNotPresent.yaml @@ -0,0 +1,130 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Only pull docker images if not already present + +# in xos-core, rcord-lite, onos and voltha charts +image: + pullPolicy: 'IfNotPresent' + +# in xos-core chart and other charts with multiple images +images: + xos_core: + pullPolicy: 'IfNotPresent' + xos_chameleon: + pullPolicy: 'IfNotPresent' + xos_tosca: + pullPolicy: 'IfNotPresent' + xos_api_tester: + pullPolicy: 'IfNotPresent' + tosca_loader: + pullPolicy: 'IfNotPresent' + +xos-db: + image: + pullPolicy: 'IfNotPresent' + +# in xos-gui sub-chart required by xos-core chart +xos-gui: + images: + xos_gui: + pullPolicy: 'IfNotPresent' + xos_ws: + pullPolicy: 'IfNotPresent' + +# in RCORD service chart +addressmanager: + image: + pullPolicy: 'IfNotPresent' +att-workflow-driver: + image: + pullPolicy: 'IfNotPresent' +fabric: + image: + pullPolicy: 'IfNotPresent' +fabric-crossconnect: + image: + pullPolicy: 'IfNotPresent' +onos-service: + image: + pullPolicy: 'IfNotPresent' +volt: + image: + pullPolicy: 'IfNotPresent' +vsg-hw: + image: + pullPolicy: 'IfNotPresent' +rcord: + image: + pullPolicy: 'IfNotPresent' +vrouter: + image: + pullPolicy: 'IfNotPresent' + +# in BASE-OPENSTACK chart +openstack: + image: + pullPolicy: 'IfNotPresent' + +vtn-service: + image: + pullPolicy: 'IfNotPresent' + +# in MCORD +vmme: + image: + pullPolicy: 'IfNotPresent' +vspgwc: + image: + pullPolicy: 'IfNotPresent' +vspgwu: + image: + pullPolicy: 'IfNotPresent' +vhss: + image: + pullPolicy: 'IfNotPresent' +hssdb: + image: + pullPolicy: 'IfNotPresent' +internetemulator: + image: + pullPolicy: 'IfNotPresent' +sdncontroller: + image: + pullPolicy: 'IfNotPresent' +epc-service: + image: + pullPolicy: 'IfNotPresent' +k8sepcservice: + image: + pullPolicy: 'IfNotPresent' +mcord-subscriber: + image: + pullPolicy: 'IfNotPresent' +progran: + image: + pullPolicy: 'IfNotPresent' + +# others +kubernetes: + image: + pullPolicy: 'IfNotPresent' +exampleservice: + image: + pullPolicy: 'IfNotPresent' +simpleexampleservice: + image: + pullPolicy: 'IfNotPresent' + diff --git a/helm-charts/examples/kafka-production.yaml b/helm-charts/examples/kafka-production.yaml new file mode 100644 index 0000000..399edf2 --- /dev/null +++ b/helm-charts/examples/kafka-production.yaml @@ -0,0 +1,53 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Deploy a production ready Kafka with persistent storage +# +# Tested with v0.8.8 of the chart from the helm incubator +# +# ex: +# helm install -f examples/kafka-production.yaml --version 0.8.8 -n cord-kafka incubator/kafka + +# ref: https://kafka.apache.org/documentation/#configuration + +configurationOverrides: + "offsets.topic.replication.factor": 3 + "log.retention.hours": 4 + "log.message.timestamp.type": "LogAppendTime" + +# NOTE: The log.message.timestamp.type override causes timestamps set by the +# producer be overridden on the broker. This should be removed once all kafka +# libraries have been updated to use the newer v1 message format that add the +# timestamp to the message. +# +# The `afkak` client in VOLTHA uses the outdated format, and reports -1 as the +# timestamp. +# +# More context: +# https://cwiki.apache.org/confluence/display/KAFKA/KIP-32+-+Add+timestamps+to+Kafka+message + +replicas: 3 + +persistence: + enabled: true + storageClass: "local-ssd" + size: "10Gi" + +zookeeper: + replicaCount: 3 + persistence: + enabled: true + storageClass: "local-hdd" + size: "10Gi" diff --git a/helm-charts/examples/kafka-single.yaml b/helm-charts/examples/kafka-single.yaml new file mode 100644 index 0000000..8764a9d --- /dev/null +++ b/helm-charts/examples/kafka-single.yaml @@ -0,0 +1,48 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Deploy a single replica of Kafka during development +# +# Tested with v0.8.8 of the chart from the helm incubator +# +# ex: +# helm install -f examples/kafka-single.yaml --version 0.8.8 -n cord-kafka incubator/kafka + +# ref: https://kafka.apache.org/documentation/#configuration +configurationOverrides: + "offsets.topic.replication.factor": 1 + "log.retention.hours": 4 + "log.message.timestamp.type": "LogAppendTime" + +# NOTE: The log.message.timestamp.type override causes timestamps set by the +# producer be overridden on the broker. This should be removed once all kafka +# libraries have been updated to use the newer v1 message format that add the +# timestamp to the message. +# +# The `afkak` client in VOLTHA uses the outdated format, and reports -1 as the +# timestamp. +# +# More context: +# https://cwiki.apache.org/confluence/display/KAFKA/KIP-32+-+Add+timestamps+to+Kafka+message +# +replicas: 1 + +persistence: + enabled: false + +zookeeper: + replicaCount: 1 + persistence: + enabled: false diff --git a/helm-charts/examples/logging-single.yaml b/helm-charts/examples/logging-single.yaml new file mode 100644 index 0000000..025867e --- /dev/null +++ b/helm-charts/examples/logging-single.yaml @@ -0,0 +1,37 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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 testing logging, don't persist data and runs minimum instances of +# elasticsearch components + +elasticsearch: + + cluster: + env: + MINIMUM_MASTER_NODES: "1" + + client: + replicas: 1 + + master: + replicas: 2 + persistence: + enabled: false + + data: + replicas: 1 + persistence: + enabled: false + diff --git a/helm-charts/examples/mcord-images.yaml b/helm-charts/examples/mcord-images.yaml new file mode 100644 index 0000000..d65398f --- /dev/null +++ b/helm-charts/examples/mcord-images.yaml @@ -0,0 +1,32 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Download smaller images for the M-CORD services (for development) + +genericImageURL: &imageURL "https://github.com/opencord/platform-install/releases/download/vms/trusty-server-cloudimg-amd64-disk1.img.20170201" +vmme: + vnfImageURL: *imageURL +vspgwc: + vnfImageURL: *imageURL +vspgwu: + vnfImageURL: *imageURL +vhss: + vnfImageURL: *imageURL +hssdb: + vnfImageURL: *imageURL +internetemulator: + vnfImageURL: *imageURL +sdncontroller: + vnfImageURL: *imageURL diff --git a/helm-charts/examples/onos-nodeport-values.yaml b/helm-charts/examples/onos-nodeport-values.yaml new file mode 100644 index 0000000..8745474 --- /dev/null +++ b/helm-charts/examples/onos-nodeport-values.yaml @@ -0,0 +1,32 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Expose ONOS services using NodePorts +# +# helm install -f examples/onos-nodeport-values.yaml onos + +services: + openflowServiceType: NodePort + ovsdbServiceType: NodePort + sshServiceType: NodePort + uiServiceType: NodePort + ovsdb: + nodePort: 31640 + openflow: + nodePort: 31653 + ssh: + nodePort: 31101 + ui: + nodePort: 31181 diff --git a/helm-charts/examples/openstack-dev-master-node.yaml b/helm-charts/examples/openstack-dev-master-node.yaml new file mode 100644 index 0000000..ee8c91f --- /dev/null +++ b/helm-charts/examples/openstack-dev-master-node.yaml @@ -0,0 +1,25 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# kubectl create -f examples/openstack-dev-master-node.yaml + +kind: Service +apiVersion: v1 +metadata: + name: master + namespace: default +spec: + type: ExternalName + externalName: 172.17.0.1 \ No newline at end of file diff --git a/helm-charts/examples/openstack-instance-tosca.yaml b/helm-charts/examples/openstack-instance-tosca.yaml new file mode 100644 index 0000000..1e12cfa --- /dev/null +++ b/helm-charts/examples/openstack-instance-tosca.yaml @@ -0,0 +1,92 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# TOSCA recipe for adding a sample R-CORD subscriber +# +# http POST $(minikube service xos-tosca --url)/run \ +# xos-username:admin@opencord.org xos-password:letmein \ +# @./openstack-instance-tosca.yaml + +tosca_definitions_version: tosca_simple_yaml_1_0 + +imports: + - custom_types/flavor.yaml + - custom_types/image.yaml + - custom_types/node.yaml + - custom_types/instance.yaml + - custom_types/slice.yaml + - custom_types/site.yaml + +description: openstack extensions to deployment + +topology_template: + node_templates: + +# Images and flavors + Ubuntu-14.04: + type: tosca.nodes.Image + properties: + name: "Ubuntu 14.04 64-bit" + disk_format: QCOW2 + container_format: BARE + path: https://github.com/opencord/platform-install/releases/download/vms/trusty-server-cloudimg-amd64-disk1.img.20170201 + + m1.small: + type: tosca.nodes.Flavor + properties: + name: m1.small + must-exist: true + + mysite: + type: tosca.nodes.Site + properties: + name: mysite + must-exist: true + + mysite_test: + description: Test Slice + type: tosca.nodes.Slice + properties: + name: mysite_test + requirements: + - site: + node: mysite + relationship: tosca.relationships.BelongsToOne + + compute1: + type: tosca.nodes.Node + properties: + name: insert-node-hostname-here + must-exist: true + + test_instance: + description: Test Instance + type: tosca.nodes.Instance + properties: + name: test_instance + requirements: + - image: + node: Ubuntu-14.04 + relationship: tosca.relationships.BelongsToOne + - flavor: + node: m1.small + relationship: tosca.relationships.BelongsToOne + - slice: + node: mysite_test + relationship: tosca.relationships.BelongsToOne + - node: + node: compute1 + relationship: tosca.relationships.BelongsToOne diff --git a/helm-charts/examples/registry-cephfs.yaml b/helm-charts/examples/registry-cephfs.yaml new file mode 100644 index 0000000..283ee1a --- /dev/null +++ b/helm-charts/examples/registry-cephfs.yaml @@ -0,0 +1,33 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Values file to implement a docker registry using the cord-cephfs StorageClass + +service: + type: NodePort + nodePort: 30500 + +persistence: + enabled: true + storageClass: "cord-cephfs" + accessMode: ReadWriteMany + +replicaCount: 2 + +resources: + limits: + cpu: 100m + memory: 100Mi + diff --git a/helm-charts/examples/sample-rcord-subscriber-tosca.yaml b/helm-charts/examples/sample-rcord-subscriber-tosca.yaml new file mode 100644 index 0000000..4c589f9 --- /dev/null +++ b/helm-charts/examples/sample-rcord-subscriber-tosca.yaml @@ -0,0 +1,79 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# TOSCA recipe for adding a sample R-CORD subscriber +# +# http POST $(minikube service xos-tosca --url)/run \ +# xos-username:admin@opencord.org xos-password:letmein \ +# @./sample-rcord-subscriber-tosca.yaml + + +tosca_definitions_version: tosca_simple_yaml_1_0 + +description: Creates a CORD test subscriber, created by platform-install + +imports: + - custom_types/cordsubscriberroot.yaml + - custom_types/voltservice.yaml + - custom_types/voltdevice.yaml + - custom_types/voltdeviceport.yaml + - custom_types/serviceinstancelink.yaml + +topology_template: + node_templates: + + service#volt: + type: tosca.nodes.VOLTService + properties: + name: volt + must-exist: true + + # Setup an OLT Device + volt_device: + type: tosca.nodes.VOLTDevice + properties: + name: test-volt-device + device_id: volt-1 + host: 8.8.8.8 + port: 2194 + requirements: + - volt_service: + node: service#volt + relationship: tosca.relationships.BelongsToOne + + volt_port: + type: tosca.nodes.VOLTDevicePort + properties: + port_id: volt-port-1 + s_tag: 222 + requirements: + - volt_device: + node: volt_device + relationship: tosca.relationships.BelongsToOne + + # A subscriber + my_house: + type: tosca.nodes.CordSubscriberRoot + properties: + name: My House + service_specific_id: "123" + firewall_enable: false + cdn_enable: false + url_filter_enable: false + url_filter_level: R + c_tag: 111 + olt_device: volt-1 + olt_port: volt-port-1 \ No newline at end of file diff --git a/helm-charts/examples/xos-db-ceph-rbd.yaml b/helm-charts/examples/xos-db-ceph-rbd.yaml new file mode 100644 index 0000000..0a78154 --- /dev/null +++ b/helm-charts/examples/xos-db-ceph-rbd.yaml @@ -0,0 +1,20 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +# Use a Ceph RBD volume to store the XOS database + +xos-db: + needDBPersistence: true + storageClassName: cord-ceph-rbd diff --git a/helm-charts/examples/xos-db-local-dir.yaml b/helm-charts/examples/xos-db-local-dir.yaml new file mode 100644 index 0000000..ab2e0da --- /dev/null +++ b/helm-charts/examples/xos-db-local-dir.yaml @@ -0,0 +1,20 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Use a local directory to store the XOS database + +xos-db: + needDBPersistence: true + storageClassName: local-directory diff --git a/helm-charts/examples/xossh-candidate.yaml b/helm-charts/examples/xossh-candidate.yaml new file mode 100644 index 0000000..a3446b1 --- /dev/null +++ b/helm-charts/examples/xossh-candidate.yaml @@ -0,0 +1,19 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Use locally created xos-client container with xos-tools/xossh chart +image: + tag: 'candidate' + pullPolicy: 'IfNotPresent' diff --git a/helm-charts/helm-charts-org b/helm-charts/helm-charts-org new file mode 160000 index 0000000..7f60470 --- /dev/null +++ b/helm-charts/helm-charts-org @@ -0,0 +1 @@ +Subproject commit 7f604708fcde87d087aad0e463288392636eed82 diff --git a/helm-charts/logging/.helmignore b/helm-charts/logging/.helmignore new file mode 100644 index 0000000..f0c1319 --- /dev/null +++ b/helm-charts/logging/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/helm-charts/logging/Chart.yaml b/helm-charts/logging/Chart.yaml new file mode 100644 index 0000000..2817563 --- /dev/null +++ b/helm-charts/logging/Chart.yaml @@ -0,0 +1,18 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +description: Sets up log aggregation infrastructure in Kubernetes, with elasticstack and kibana +name: logging +version: 1.1.0 diff --git a/helm-charts/logging/README.md b/helm-charts/logging/README.md new file mode 100644 index 0000000..4cdd5e6 --- /dev/null +++ b/helm-charts/logging/README.md @@ -0,0 +1,22 @@ +# Logging + +This chart implements a log aggregation framework built on elasticsearch within +kubernetes. + +It requires persistent storage, and currently has default values for the +`local-provisioner` with storage on each k8s node. + +Once these prereqs are satisfied, it can be run with: + + helm install -n logging logging + +(NOTE: the name must be `logging` currently, or name lookups within the pod are broken) + +## Current log sources + +- Container logs from k8s with [fluentd-elasticsearch](https://github.com/helm/charts/tree/master/stable/fluentd-elasticsearch) + +## Using Kibana + +Visit: http://:30601 + diff --git a/helm-charts/logging/requirements.yaml b/helm-charts/logging/requirements.yaml new file mode 100644 index 0000000..73fb4ab --- /dev/null +++ b/helm-charts/logging/requirements.yaml @@ -0,0 +1,35 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +dependencies: + +- name: elasticsearch + version: 1.15.3 + repository: https://kubernetes-charts.storage.googleapis.com/ + +- name: kibana + condition: kibana.enabled + version: 1.1.2 + repository: https://kubernetes-charts.storage.googleapis.com/ + +- name: fluentd-elasticsearch + condition: fluentd-elasticsearch.enabled + version: 1.4.1 + repository: https://kubernetes-charts.storage.googleapis.com/ + +- name: logstash + condition: logstash.enabled + version: 1.4.2 + repository: https://kubernetes-charts.storage.googleapis.com/ diff --git a/helm-charts/logging/templates/NOTES.txt b/helm-charts/logging/templates/NOTES.txt new file mode 100644 index 0000000..7802534 --- /dev/null +++ b/helm-charts/logging/templates/NOTES.txt @@ -0,0 +1,16 @@ +** Log aggregation for CORD ** + +This chart runs the following services: + +- Elasticsearch + +and optionally: + +- Kibana +- Logstash +- fluentd-elasticsearch (container logs from k8s) + +To access Kibana, go to: + + http://:{{ .Values.kibana.service.nodePort }} + diff --git a/helm-charts/logging/values.yaml b/helm-charts/logging/values.yaml new file mode 100644 index 0000000..fb86e23 --- /dev/null +++ b/helm-charts/logging/values.yaml @@ -0,0 +1,144 @@ +--- +# Copyright 2018--present Open Networking Foundation +# +# 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. + +# Values file for SEBA log aggregation infra +# NOTE: must start this chart with the name "logging": +# helm install -n logging logging +# ortherwise the elasticsearch hostname won't work properly in the other containers + +# elasticstack config +# ref: https://github.com/helm/charts/tree/master/incubator/elasticsearch +elasticsearch: + client: + serviceType: "NodePort" + master: + persistence: + storageClass: "local-ssd" + size: "5Gi" + data: + persistence: + storageClass: "local-hdd" + size: "10Gi" + +# kibana config +# ref: https://github.com/helm/charts/tree/master/stable/kibana +kibana: + enabled: true +# dashboardImport: +# dashboards: |- +# + service: + type: "NodePort" + nodePort: 30601 + env: + ELASTICSEARCH_URL: "http://logging-elasticsearch-client:9200" + + dashboardImport: + dashboards: + 1_create_index: |- + { + "version": "6.4.2", + "objects": [ + { + "id": "749ea2f0-d15c-11e8-b4aa-8f5499fd5eba", + "type": "index-pattern", + "version": 2, + "attributes": { + "title": "logstash-*", + "timeFieldName": "@timestamp", + "fields": "[{\"name\":\"@timestamp\",\"type\":\"date\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"@version\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"_id\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"_index\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"_score\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"_source\",\"type\":\"_source\",\"count\":0,\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"_type\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"bundle.id\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"bundle.id.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"bundle.name\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"bundle.name.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"bundle.version\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"bundle.version.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"category\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"category.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"error.message\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"error.message.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"error.type\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"error.type.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"detail\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"geoip.ip\",\"type\":\"ip\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"geoip.latitude\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"geoip.location\",\"type\":\"geo_point\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"geoip.longitude\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"host.name\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"host.name.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"input.type\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"input.type.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"kafka_key\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"kafka_key.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"kafka_timestamp\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"kafka_timestamp.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"kafka_topic\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"kafka_topic.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"levelname\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"levelname.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"levelno\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"lineno\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"message\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"offset\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"msg.model\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"msg.version\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"thread\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"threadName\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"type\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"type.keyword\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true}]" + } + } + ] + } + +# logstash config +# ref: https://github.com/helm/charts/tree/master/incubator/logstash +logstash: + enabled: true + elasticsearch: + host: "logging-elasticsearch-client" + + # we have kafka, so persistence isn't needed + # ref: https://www.elastic.co/guide/en/logstash/current/persistent-queues.html + persistence: + enabled: false + + # Probe default delays are too short, which puts logstash into a reboot loop + livenessProbe: + initialDelaySeconds: 120 + + readinessProbe: + initialDelaySeconds: 120 + + # 'config' k/v are turned into env vars for logstash container + # ref: https://www.elastic.co/guide/en/logstash/current/docker-config.html#docker-env-config + # config: + # LOG_LEVEL: trace + + # Kafka input plugin + # ref: https://www.elastic.co/guide/en/logstash/current/plugins-inputs-kafka.html + inputs: + main: |- + input { + kafka { + auto_offset_reset => "earliest" # get all previous items from new topics + bootstrap_servers => "cord-kafka:9092" + client_id => "logstash_ck" + codec => json { charset => "UTF-8" } + consumer_threads => 1 + decorate_events => true + group_id => "logstash_ck" + metadata_max_age_ms => 60000 # recheck for new topics every minute + # other topics that are not indexed: xos.gui_events, voltha.kpis, voltha.heartbeat + topics_pattern => '.*\.events|dhcp.*|onos.*|.*\.log.*' + type => "cord-kafka" + } + } + + filters: + main: |- + filter { + mutate { + add_field => { + "kafka_topic" => "%{[@metadata][kafka][topic]}" + "kafka_key" => "%{[@metadata][kafka][key]}" + "kafka_timestamp" => "%{[@metadata][kafka][timestamp]}" + } + } + + json { + source => "data" + target => "data" + skip_on_invalid_json => true + } + } + + outputs: + main: |- + output { + elasticsearch { + hosts => ["${ELASTICSEARCH_HOST}:${ELASTICSEARCH_PORT}"] + } + } + +# fluentd-elasticsearch config +# ref: https://github.com/helm/charts/tree/master/stable/fluentd-elasticsearch +# forwards k8s logs from nodes to elasticsearch +fluentd-elasticsearch: + enabled: false + elasticsearch: + host: "logging-elasticsearch-client" + diff --git a/helm-charts/mavenrepo/Chart.yaml b/helm-charts/mavenrepo/Chart.yaml new file mode 100644 index 0000000..40351d4 --- /dev/null +++ b/helm-charts/mavenrepo/Chart.yaml @@ -0,0 +1,20 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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: mavenrepo +icon: https://guide.opencord.org/logos/cord.svg +version: 1.0.0 + +appVersion: 'latest' diff --git a/helm-charts/mavenrepo/templates/_helpers.tpl b/helm-charts/mavenrepo/templates/_helpers.tpl new file mode 100644 index 0000000..8d64325 --- /dev/null +++ b/helm-charts/mavenrepo/templates/_helpers.tpl @@ -0,0 +1,36 @@ + +{{- /* + Copyright 2017-present Open Networking Foundation + + 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. + */ -}} + + {{- define "mavenrepo.name" -}} + {{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} + {{- end -}} + +{{- define "mavenrepo.release_labels" }} +app: {{ printf "%s-%s" .Release.Name .Chart.Name | trunc 63 }} +version: {{ .Chart.Version }} +release: {{ .Release.Name }} +{{- end }} +{{- define "mavenrepo.fullname" -}} +{{- printf "%s-%s" .Release.Name .Chart.Name | trunc 63 -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "mavenrepo.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} diff --git a/helm-charts/mavenrepo/templates/deployment.yaml b/helm-charts/mavenrepo/templates/deployment.yaml new file mode 100644 index 0000000..a222c06 --- /dev/null +++ b/helm-charts/mavenrepo/templates/deployment.yaml @@ -0,0 +1,36 @@ +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: mavenrepo + labels: + app: mavenrepo +spec: + replicas: 1 + template: + metadata: + labels: + app: {{ template "mavenrepo.name" . }} + release: {{ .Release.Name }} + spec: + containers: + - name: mavenrepo + image: {{ .Values.global.registry }}{{ .Values.image.repository }}:{{ tpl .Values.image.tag . }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + ports: + - containerPort: 80 + port: 80 + protocol: TCP diff --git a/helm-charts/mavenrepo/templates/repo-service.yaml b/helm-charts/mavenrepo/templates/repo-service.yaml new file mode 100644 index 0000000..f9ba1d8 --- /dev/null +++ b/helm-charts/mavenrepo/templates/repo-service.yaml @@ -0,0 +1,33 @@ +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Service +metadata: + name: {{ template "mavenrepo.fullname" . }}-http + labels: + app: {{ template "mavenrepo.name" . }} + chart: {{ template "mavenrepo.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + type: NodePort + ports: + - name: http + port: 80 + targetPort: 80 + nodePort: 30160 + selector: + app: mavenrepo + release: {{ .Release.Name }} diff --git a/helm-charts/mavenrepo/values.yaml b/helm-charts/mavenrepo/values.yaml new file mode 100644 index 0000000..f5bdd17 --- /dev/null +++ b/helm-charts/mavenrepo/values.yaml @@ -0,0 +1,27 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +# helm install mavenrepo -n mavenrepo + +image: + repository: 'opencord/mavenrepo' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + +global: + registry: '' + +nameOverride: "" +fullnameOverride: "" diff --git a/helm-charts/mcord-release/Dockerfile.sriovds/Dockerfile b/helm-charts/mcord-release/Dockerfile.sriovds/Dockerfile new file mode 100644 index 0000000..bae1e3f --- /dev/null +++ b/helm-charts/mcord-release/Dockerfile.sriovds/Dockerfile @@ -0,0 +1,43 @@ +# Build multus plugin +FROM golang:1.10 AS multus +RUN git clone -q --depth 1 https://github.com/intel/multus-cni.git /go/src/github.com/intel/multus-cni +WORKDIR /go/src/github.com/intel/multus-cni +RUN ./build + +# Build sriov plugin +FROM golang:1.10 AS sriov-cni +RUN git clone -q -b dev/k8s-deviceid-model https://github.com/Intel-Corp/sriov-cni.git /go/src/github.com/intel-corp/sriov-cni +WORKDIR /go/src/github.com/intel-corp/sriov-cni +RUN ./build + +# Build sriov device plugin +FROM golang:1.10 AS sriov-dp +RUN git clone -q https://github.com/intel/sriov-network-device-plugin.git /go/src/github.com/intel/sriov-network-device-plugin +WORKDIR /go/src/github.com/intel/sriov-network-device-plugin +RUN make + +# Build centralip ipam plugin +FROM golang:1.10 AS centralip-ipam +RUN go get -u github.com/kardianos/govendor +RUN git clone -q https://github.com/John-Lin/ovs-cni.git /go/src/github.com/John-Lin/ovs-cni +WORKDIR /go/src/github.com/John-Lin/ovs-cni +RUN govendor sync && ./build.sh + +# Build vfioveth plugin +FROM busybox as vfioveth +RUN wget -O /bin/vfioveth https://raw.githubusercontent.com/clearlinux/cloud-native-setup/master/clr-k8s-examples/9-multi-network/cni/vfioveth +RUN wget -O /bin/jq https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64 +RUN chmod +x /bin/vfioveth /bin/jq + +# Final image +FROM centos/systemd +LABEL author="Saikrishna Edupuganti " +WORKDIR /tmp/cni/bin +COPY --from=multus /go/src/github.com/intel/multus-cni/bin/multus . +COPY --from=sriov-cni /go/src/github.com/intel-corp/sriov-cni/bin/sriov . +COPY --from=centralip-ipam /go/src/github.com/John-Lin/ovs-cni/bin/centralip . +COPY --from=vfioveth /bin/vfioveth . +COPY --from=vfioveth /bin/jq . +WORKDIR /usr/bin +COPY --from=sriov-dp /go/src/github.com/intel/sriov-network-device-plugin/build/sriovdp . + diff --git a/helm-charts/mcord-release/assets/mcord-architecture.png b/helm-charts/mcord-release/assets/mcord-architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..e36d0e8c117b43b620d949f9e21d585fe6a8fdd4 GIT binary patch literal 285399 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 xMmag{f{w#O#NSPCmF4?xx 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

*ig` zGcT@oLiBYR_1P)x>>i8IkDLWnNB108O}hK0Gs==5bRa9&ZOQIuR#fE-apdxkq#snb#wV_ya(A(BTHUF^P*Ja}`7YTM5FR{v&)WqWmJo;zKs5{DI!u{L72?G`wFdHY;lk92=fp z-s9gst9M>x`FQf>tJ( z7Lthcr%p*b78d|nesG#Ct1i#{(k>{TSv+4dViyl|8Vhh;2YgGtX#MCPcc0|BxcOP# zf?bemcLEhCqgueq=YPMGzNo{80ckw8K~fsixH$GIEOvh7x6)Q^WbHZ;V61(}BBHw& z@3h@H0z|}zyvJ=zp~BxNxNIG=4WYf-(1aQn<6x+#*+>SLA*{;k^7qc%ptvyYH+OeB zFnn}louY%P95L=eUW4ryC@aF}IpqfbbEIjw$1-9sh<3vYRVX@nZ4q11j0s=Y$(+1< znO6k-Z*7|OEA>pUYzo^y|FcpTSJ6fCKllfY0=3mzs8Mcv)?opjBq9D3DxCwZ z4Ii-6;&&1h8&dV#z(B6JO#!V;xYLXCKEVmvgy4#T@U}{n|qlq4HdT~h~bR6EV2G9 zvC;ry!uUQYML0bwe_sDtDKDJ4p*UaQY^s%!V8soe{>wJEsKAQuBr z@;-ibo_(Q49{NyMB+^pLwW#irWuLHyl&mCc{T2yoT_ONWR=!tWSJnz8*bY1esaExqyqKH5X8E9n`R>tBGO%1of_CL<^))HcoxZPj;Z8oeu5cTQuHX~V<%o_K}C?5c;a%X zSF`q!s$2fz$NCEukK!*qq`3S5^NF)k$g~CPk~jKlJUw9#Mtw> zu4JuwrM(VkVTsZ}@tjGUJ=`S;_cx2jp&vxSUS^(G>;8S4o!YT}u<%NxzxQltdnaCD z2tR%DhO}pn%9^qKp>{!rl8A;2Tx_`1FlCh4F*lY!`9@fv>iN2HUTbnvMPI4Lq;O~^ zoFXNbOY6RR7lmO}-tEyP1*Yz~f)~lxr_BTFt);FU#o^1o z#>gteCaZ-ax8@n&zEh`hNhD8s(UZ|bS)jx}SG)Tzfy+~uu$SQlZG7Moa|^v7?sCO4 z^WUVr3hV*$xj|aom!qS{LrQ95&yAXE*ZTC>}ug^%Sn8H7zQ-*h9rgEgykXZPfoI;4+Ki%ENdm=OpJ^ z(-lSQsSmQ7y;Cw?2a8_g84CR}cOgbGTr8at;4C7OR|~R&5+-fBGt5_EX#ze*57BkH zbqBR$H4v5`3sHW^%S8SVtvW3YqfYkRo!|-F$60G4n^T`>NSPgo_Un5S-)vJtYoqTI ze)`=DU@P>abh|kfOxO=S&Z<`%V>wjQZW#LZi;L$3FD+Lz-ic=6mYkXvopvX&@r(@x ziiZ0Zd->Y(Nmc+xHG%SR>qw^Xz~0-h$EiZemcc0PkHY#s=qZ&!-emu5XQ8W%&@f=V zHC$$N8)qJ=^QtXlI4H^blykMMxR!(`^o8w`0)>RVSNZa0z_714f1%Q+W#w50gf}eP z6d9lasS%(32%&N6Zi|l;af`j}FX6GAKg+RIvr)Jno+k4X=2`IO#i_!%1u^_NbPSbo z4|!B)_`%XKQw$`pfqUY~nw1&q^QqqSaw)mNj-^b~7BZDoHD%e272amm&+G!0yrFA@ zh9y#RRh0@x>oTkLG~yjQ5hbQ|@tV_ZA;v8e-Vb_QUoG@KgxKu;oP%d7wiha<77o}R zRn25GDOKYsqNQ!9U#QiV&bG%q*>+1cMsUf1E%!yny_-nI$#|OfEGn6NbeeNn;rDk+ zYHRUS0yeUteMsn+U7l|S(YFeyH?%%vezojBE-Tp;Fp-nWV3%U?X*AKz2Td=*og zy6?U|L0(D`#hF-wWJXbZgzEIp9=tQg1>L?}vnUHzqu*q#LR)aIl%=7+YG(yWEg) zr~9DJX+ga&+n&9)oqJSzr)K5RP2t_(37_Nd!>|gpP?Ex`hGvHCtC{%t0=p=-&Ltim`}Es+mYW+7IISF zjJ0_|i*JywVx|Sk4WonmUtPoQrg!f2KS0J*EvttVOF+0FMcoZN@D+V-)y;*j`5*IN zm+T`e?pyI*$ggtym=e zG#x{yZXLa>Fd-m8J5d$oV2Sdx(y>|$5}WDtd7uF0L?Efn9X6I^Rx>TY9CRp}mM_hz ze{pe?d-A>%weO=HV-SHNrK1a>8+6}xBxK#vh?F?0O}%H}Tl};yy~0KHy1m}3`Ag$& zS!xBbr7uUV4VU+|L!{u1y!uj?l$V5`M!V13+IPaFTp#8=s7Oj!k#JDkjJ0@r@JLBe z@S{f|4Q*M7#41G***!yyLkBMVHZH-!xdjv(HoooEV%$z$BSIM*r}xY4C`vZH7hDR| z(vAc6I3O_6zUinFERM`U1-Zqw+qb5K+6FTtkg;a=an~GwehXrc+bOiAO7?|KTPTRM z?y}#xMhCCW@EjNHekXHZI;B$S;2vw4oTic>ocnkj-@|M$USv%*N2fs7=TI@ZUNgaI z*>n)~a{lJb3r`X0qJd+(=&MP2vAV-N?Oql3W3MumV&MIA+I5gpUG)05oK|vc<|Mg#B239o1y})&D%?AZ4VW*m0W)l#^ZWX5 zFX4{kiVI1qs`aa07i*;E4&A%R3KRf#YS{eR3gvSp+6kS6!6Iw;8zWYI)zBnSi}HbW zT`33lZyV#iOhIJfM1;*E{CNi^_*#`aEHkDre}0Y4!&jG${CY_OlBYCk%BJ45A~VS? zW_+KHz5m=3nXr*t>Z>m`Um$5VLj}ZNWV2Lq#$GT}9ZvAR6SyK~=yv_O9Wt!(hH-;j zGcb?aN|q@qu*-Od-|;c7%U%AS3?ZsPWPfr~y@#K^>SVlP<7!9RBMm_B5b z@zh?d45>XIQGLtF&==|AuoiC+mK?p3xt!3SAn@$ryP_f6q^b$rs2dh$yg!KH2p@*@ zY`H3>hT91qLxnjPmV3J{h7C8T>;!8NrgHxRS=X?z%l$;82YRn0tgVa<6REU?&r?3HdZ8)B>^{+NB?3F|c?{9GY{F_r+h2s( z9n798xYCkdWZ2@NVof({>9elQr~4y&&}OX8_&_VH+<@OSIL10;H`QOXdQD+y`5Nx> zCn|Eq@XOMhwMpLa5aRyEMV63dwU?t^if2XKn!5xUtf*mG=tsMWTx|k`aqU!A;yksL zm%D668f5$+V*Qr97Tc!+=p^)g`um-lB$CSVb!$EPKWJ22zSI&njOL0p+BP%Qix8tQ zK*SGFRmr3FtvbwX4xa_SeB)D_Cg35OSX-yXnGdtV#O&ad>Q5hLI*Ftiym7xIzg%cu z_@z(lniv5kBhFx?_qve~6P3_tT4Rsj`lg2S>R#FOjENk;VhSuo#r)qZRrsP0wu;~n z2F$O@we70X?HXp*4^{&dB^#ZYfhvc~Ao$}>kJIAYUqYrMLI<55`d@)axVJ4tQhAQm z9~WQA|MC5xBZ^)#tbTB&sN#m)J4x$HH1}GYQ95dyps57eaDcQ3M1=H0R8&F%qNKoyJr3u7@RDJ5 z-`~dpr?Fs-^%@5zuF!c`3CLq~?fD4?yD;3waRz$>_{i^d()$Ye;|Lyy6$jF%-ECTt zTpH@~^r0=i0L|TLOc!MF7nM4KSX{kT220b_J9!hE%LujZVN zOV5U^k7WjPFyxl0tLnoy9ZVgn!udN%Y;$Fs15<0MZ#oX9cHVMpC}_B_XSr;%P#LnaZN!^)(l?QUZJ36O)^Rz7N+24DIP_-6Zy zxiTzuc%%cb*dBLTz`AI{4!NSavJVbs_~d6SGMy>(Bi(k_sE`m8Ek@rquj{fci%jwB z4wiZx39>%PfB#EhwJzBnJj2t>WG&}ryOR_KA-feIdHcRvS64tX3@_zP0ZHiEe6~Po z`RYc_qr)BiGIQ{b1f$)+_~wo6(78B+FxfSYW&dRrr3&YzZ=z|Fy&%88ZT)4a)V}cm z9FA-VL_HSSRESGeC{ zcIc^p_Sv~C#A2#(4&B;}&Mb)jokptb9jZBFNWSP(q?L5!sG#Ag*$?1?UwHzdm zML$f=gB~0$@TWHjFOIk?udGmrZ1qqPC3mXo7fya;>K5OUs4g~*FQ|X+xbppC3FCQf zM@7o@9mHl~xdpB8L4~j>JMy}lo_e!G0qGOB=JB!Z@{l{@`0Y7mF{~qOTNBM(q!D!; zWlsU}PSR2|FF{h7OAVWRzxmGmnLgI&or>7#97&&(%0KlkzxfQG2IG<;1^f{v?`;_L| z*L%`HOYc>s=5pwuqtragyf?PUh%CPQbi0i#HQOZu$s+N{Akv>xVAkJJ@*1;?0lb?t zBPkvIME98Q?4|GY6C3VTa90ze|7Lf3k=1F18{FSa)G8P5!Ewz z{w}Iv>QF#2IiP0=dlS8q<&VlalEitwAduep#2K0uCTVve50|#P5;t8CyPPGc_T&;i zEw*3j%WDQq;OW*ljR`ZKCeLCJ`5`2XM*{0NaY+c+PK%^!0Uu|y?WNJ-OG&y+LClHh& zy>K*d%5EAKyO|kS10UQQ;~$c!wa>}$I1-Wv63t{+d(s7MG&)!W&5%a@X#uh5w}}n! z#u|@5eK_8s;x|6%3FE9nW~3#F&Bz`zIO;f}?l*V4mrHCjpRL#W9LL0VZ-u?_m{qDp zF^=J4w&0>j7eM|>04mNz%}IZ&8B-7itO;DydZLCiB^Y|6siiv-oHQ9v2UkVx(@>11 zCoK|*sJDSv-WV>;`ZdWY$$16Z1SSuqGTC&I8zFLS@-JL6Nm?A@tz?mxIuXvB#~A!0 zPEaK#{{RGSoJZKpPn8_~(!cQHJI<#pd~lE&^e1HFLC){m8s%<<<=Z5u|VC;ynI-5#nfD6Z~wUv0|;{>7D{T{|CWDYvK zuO7ln0aEA8%4GG@GE-3+sjxjIkoW1cuKh4M- zI5B%kr7ug4A;o>@0p&o>i*I<;6%|MX1vY>;f2P5y9+WzEKJxBwFno4{5E=SfoX znHdWWE!~ol*FmuMV!>WI*Tz!(irtbI$cjl5I-$queCE4*hm-r(_K=q9+BBKMmTt|l z3mqc@MO^844liLGDiW}DJt=3-LM8T;T3fBYI?Zp?i25q3HbCfbh8X0k%MX9Fs!|qE z3gsxZL0V$sdBwrg*Bi+eoUYqDh{pWbVsRd?W>iMQ{YYp}vAlakH@ zSe-rNuqL9r%}l~c*06bsanbTp9%0Qk zo!L%_=^V$59@4ASv`$+z>ScSOc1dSHgJ9g-@dmx$h4Vi^==(0IBH&F!23ZVexF<{8wB=UH%@ z8Q<347V7~H?&8&_RlhUFbcQPN&V2ij50>NA2Ku=Z9r>j%r*T=8Z#32}`Jk#B=tLk9 z%kxV(>XS6b%T%kzs2a`(DRXjU5l`%!hbSlI7;D{{_12NLJ*HH_U4Kwr*1C2zEP1C&1suP9Bd+jZZOd^)D=r4*rqTif;@WI#3sI?W zMbDQ9Uir>sG4Ck(N94dXcoy?0%0D)UGm`8Cv%q3&PEuH0 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¬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

G3B>KPxdihCD-}G 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�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

-;f-Ia{?sBcad+E|Kb8b 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 literal 0 HcmV?d00001 diff --git a/helm-charts/mcord-release/mcord-services/.helmignore b/helm-charts/mcord-release/mcord-services/.helmignore new file mode 100644 index 0000000..f0c1319 --- /dev/null +++ b/helm-charts/mcord-release/mcord-services/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/helm-charts/mcord-release/mcord-services/Chart.yaml b/helm-charts/mcord-release/mcord-services/Chart.yaml new file mode 100644 index 0000000..6a92698 --- /dev/null +++ b/helm-charts/mcord-release/mcord-services/Chart.yaml @@ -0,0 +1,21 @@ +--- +# Copyright 2018-present Open Networking Foundation +# Copyright 2018 Intel Corporation +# +# 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. + +apiVersion: v1 +appVersion: "1.0" +description: M-CORD services with OMEC inside +name: mcord-services +version: 0.1.0 diff --git a/helm-charts/mcord-release/mcord-services/templates/NOTES.txt b/helm-charts/mcord-release/mcord-services/templates/NOTES.txt new file mode 100644 index 0000000..b7a49b5 --- /dev/null +++ b/helm-charts/mcord-release/mcord-services/templates/NOTES.txt @@ -0,0 +1,32 @@ +{{- /* +# Copyright 2018-present Open Networking Foundation +# Copyright 2018 Intel Corporation +# +# 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. +*/ -}} + +This is the instruction to configure your eNodeB to work with ONF M-CORD. You can find architecture illustration in assets/mcord-architecture.png. + +1. Check the eNodeB is operating in following information: + eNodeB Address: {{ .Values.enb.host }} + eNodeB S1 port: {{ .Values.enb.port }} + +2. Configure eNodeB with the correct MME information, get MME IP by following commands: + export MMEIP=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.status.podIP}" pods mme-0 + export MMEPORT="36412" + + MMEPORT is fixed in templates/mme.yaml. + +3. Make sure UE's SIM card information is configured in hss.yaml. + +4. Attach UE to M-CORD. diff --git a/helm-charts/mcord-release/mcord-services/templates/_helpers.tpl b/helm-charts/mcord-release/mcord-services/templates/_helpers.tpl new file mode 100644 index 0000000..449fce3 --- /dev/null +++ b/helm-charts/mcord-release/mcord-services/templates/_helpers.tpl @@ -0,0 +1,49 @@ +{{- /* +# Copyright 2018-present Open Networking Foundation +# Copyright 2018 Intel Corporation +# +# 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. +*/ -}} + +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "mcord-services.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "mcord-services.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "mcord-services.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} diff --git a/helm-charts/mcord-release/mcord-services/templates/hss.yaml b/helm-charts/mcord-release/mcord-services/templates/hss.yaml new file mode 100644 index 0000000..bc62dd2 --- /dev/null +++ b/helm-charts/mcord-release/mcord-services/templates/hss.yaml @@ -0,0 +1,284 @@ +--- +# Copyright 2018-present Open Networking Foundation +# Copyright 2018 Intel Corporation +# +# 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. + +# Default values for mcord-vepc-helm. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ .Values.hss.name }} +data: + acl.conf: | + ALLOW_OLD_TLS *.cluster.local + hss.conf: | + Identity = "HSS_IDENTITY"; + Realm = "HSS_REALM"; + TLS_Cred = "CONF_DIR/HSS_HOST.cert.pem", "CONF_DIR/HSS_HOST.key.pem"; + TLS_CA = "CONF_DIR/cacert.pem"; + No_SCTP; + Prefer_TCP; + No_IPv6; + SCTP_streams = 3; + NoRelay; + AppServThreads = 4; + Port = 3868; + SecPort = 5868; + LoadExtension = "/usr/local/lib/freeDiameter/acl_wl.fdx" : "CONF_DIR/acl.conf"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_3gpp2_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_draftload_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_etsi283034_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc4004_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc4006bis_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc4072_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc4590_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc5447_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc5580_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc5777_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc5778_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc6734_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc6942_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc7155_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc7683_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc7944_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29061_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29128_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29154_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29173_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29212_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29214_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29215_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29217_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29229_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29272_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29273_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29329_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29336_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29337_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29338_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29343_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29344_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29345_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29368_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29468_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts32299_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_S6as6d.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_S6t.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_S6c.fdx"; + hss.json: | + {"common": { + "fdcfg": "CONF_DIR/hss.conf", + "originhost": "HSS_IDENTITY", + "originrealm": "HSS_REALM" + }, + "hss": { + "gtwhost": "*", + "gtwport" : 9080, + "restport" : 9081, + "ossport" : 9082, + "casssrv": "HSSDB_ADDR", + "cassusr": "root", + "casspwd": "root", + "cassdb" : "vhss", + "casscoreconnections" : 2, + "cassmaxconnections" : 8, + "cassioqueuesize" : 32768, + "cassiothreads" : 2, + "randv" : true, + "optkey" : "63bfa50ee6523365ff14c1f45f88737d", + "reloadkey" : true, + "logsize": 20, + "lognumber": 5, + "logname": "LOGS_DIR/hss.log", + "logqsize": 8192, + "statlogsize": 20, + "statlognumber": 5, + "statlogname": "LOGS_DIR/hss_stat.log", + "auditlogsize": 20, + "auditlognumber": 5, + "auditlogname": "LOGS_DIR/hss_audit.log", + "statfreq": 2000, + "numworkers": 4, + "concurrent": 10, + "ossfile": "CONF_DIR/oss.json" + } + } + oss.json: | + { + "option": { + "id": "url", + "type": "string" + }, + "services": [ + { + "id": "logger", + "commands": [ + { + "id": "describe_loggers" + }, + { + "id": "set_logger_level", + "options": [ + { + "id": "name", + "type": "string" + }, + { + "id": "level", + "type": "integer" + } + ] + } + ] + }, + { + "id": "stats", + "commands": [ + { + "id": "describe_stats_frequency" + }, + { + "id": "describe_stats_live" + }, + { + "id": "set_stats_frequency", + "options": [ + { + "id": "frequency", + "type": "integer" + } + ] + } + ] + } + ] + } + launch.sh: | + #!/bin/bash -x + + CONF_DIR="/opt/c3po/hss/conf" + LOGS_DIR="/opt/c3po/hss/logs" + mkdir -p $CONF_DIR $LOGS_DIR + + cp /etc/hss/conf/{acl.conf,hss.json,hss.conf,oss.json} $CONF_DIR + + HSS_HOST=$(hostname) + HSS_DOMAIN=$(dnsdomainname) + + # from hss.json + sed -i "s!HSS_IDENTITY!$HSS_HOST.$HSS_DOMAIN!g" $CONF_DIR/hss.json + sed -i "s!HSS_REALM!$HSS_DOMAIN!g" $CONF_DIR/hss.json + sed -i "s!HSSDB_ADDR!$HSSDB_ADDR!g" $CONF_DIR/hss.json + sed -i "s!CONF_DIR!$CONF_DIR!g" $CONF_DIR/hss.json + sed -i "s!LOGS_DIR!$LOGS_DIR!g" $CONF_DIR/hss.json + + # from hss.conf + sed -i "s!HSS_IDENTITY!$HSS_HOST.$HSS_DOMAIN!g" $CONF_DIR/hss.conf + sed -i "s!HSS_REALM!$HSS_DOMAIN!g" $CONF_DIR/hss.conf + sed -i "s!HSS_HOST!$HSS_HOST!g" $CONF_DIR/hss.conf + sed -i "s!CONF_DIR!$CONF_DIR!g" $CONF_DIR/hss.conf + cat $CONF_DIR/{hss.json,hss.conf} + + # If necessary, calculate the OPc value for each UE (User Equipment). + #./bin/hss -j conf/hss.json --onlyloadkey + cd $CONF_DIR + make_certs.sh $(hostname) $(dnsdomainname) + cd .. + # finally, launch + hss -j $CONF_DIR/hss.json +--- +apiVersion: v1 +kind: Service +metadata: + name: {{ .Values.hss.name }} +spec: + selector: + app: {{ .Values.hss.name }} + clusterIP: None + ports: + - name: s6a + port: 3868 + protocol: TCP +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: {{ .Values.hss.name }} + labels: + app: {{ .Values.hss.name }} +spec: + replicas: 1 + selector: + matchLabels: + app: {{ .Values.hss.name }} + serviceName: {{ .Values.hss.name }} + template: + metadata: + labels: + app: {{ .Values.hss.name }} + spec: + initContainers: + - name: init-hss + image: {{ .Values.hss.initimage }} + imagePullPolicy: Always + command: [ "bash", "-xc"] + # TODO: Move the SIM card configuration into values.yaml + args: + - until nslookup $HSSDB_ADDR; do echo "waiting for hssdb"; sleep 2; done; + until cqlsh --file /opt/c3po/hssdb/oai_db.cql $HSSDB_ADDR; do echo "provisioning hssdb"; sleep 2; done; + until data_provisioning_users.sh 208014567891200 1122334455 apn1 465B5CE8B199B49FAA5F0A2EE238A6BC 10 $HSSDB_ADDR $MME_HOST.$MME_REALM $MME_REALM; + do echo "setting up users"; sleep 2; done; + until data_provisioning_mme.sh 1 19136246000 $MME_HOST.$MME_REALM $MME_REALM 1 $HSSDB_ADDR; do echo "setting up mme"; sleep 2; done; + until data_provisioning_mme.sh 1 19136246000 smsrouter.test3gpp.net test3gpp.net 0 $HSSDB_ADDR; do echo "setting up smsrouter"; sleep 2; done; + env: + - name: HSSDB_ADDR + value: {{ .Values.hssdb.name }} + - name: MME_HOST + value: mme-0 + - name: MME_REALM + value: {{ .Values.mme.name }}.{{ .Values.global.namespace }}.{{ .Values.global.fqdn }} + containers: + - name: hss + image: {{ .Values.hss.image }} + imagePullPolicy: {{ .Values.global.imagepullpolicy }} + stdin: true + tty: true + env: + - name: HSSDB_ADDR + value: {{ .Values.hssdb.name | quote }} + - name: MME_IDENTITY + value: {{ .Values.mme.name }}.{{ .Values.global.namespace }}.{{ .Values.global.fqdn }} + command: ["bash", "-c", "/opt/c3po/hss/launch.sh; sleep 3600"] + resources: + limits: + cpu: {{ .Values.hss.cpu | quote }} + memory: {{ .Values.hss.memory }} + volumeMounts: + - name: hss-script + mountPath: /opt/c3po/hss/launch.sh + subPath: launch.sh + - name: hss-config + mountPath: /etc/hss/conf + volumes: + - name: hss-script + configMap: + name: {{ .Values.hss.name }} + defaultMode: 493 + - name: hss-config + configMap: + name: {{ .Values.hss.name }} + defaultMode: 420 diff --git a/helm-charts/mcord-release/mcord-services/templates/hssdb.yaml b/helm-charts/mcord-release/mcord-services/templates/hssdb.yaml new file mode 100644 index 0000000..7697838 --- /dev/null +++ b/helm-charts/mcord-release/mcord-services/templates/hssdb.yaml @@ -0,0 +1,109 @@ +--- +# Copyright 2018-present Open Networking Foundation +# Copyright 2018 Intel Corporation +# +# 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. +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ .Values.hssdb.name }} +data: + cassandra-rackdc.properties: | + dc=DC1 + rack=RAC1 + prefer_local=true +--- +apiVersion: v1 +kind: Service +metadata: + labels: + app: {{ .Values.hssdb.name }} + name: {{ .Values.hssdb.name }} +spec: + clusterIP: None + ports: + - name: cql + port: 9042 + selector: + app: {{ .Values.hssdb.name }} +--- +apiVersion: "apps/v1" +kind: StatefulSet +metadata: + name: {{ .Values.hssdb.name }} + labels: + app: {{ .Values.hssdb.name }} +spec: + serviceName: {{ .Values.hssdb.name }} + replicas: 1 # 3 + selector: + matchLabels: + app: {{ .Values.hssdb.name }} + template: + metadata: + labels: + app: {{ .Values.hssdb.name }} + spec: + securityContext: + runAsUser: 999 + fsGroup: 999 + containers: + - name: cassandra + image: {{ .Values.hssdb.image }} + imagePullPolicy: {{ .Values.global.imagepullpolicy }} + ports: + - containerPort: 9042 + name: cql + resources: + limits: + cpu: {{ .Values.hssdb.cpu | quote }} + memory: {{ .Values.hssdb.memory }} + env: + - name: MAX_HEAP_SIZE + value: 512M + - name: HEAP_NEWSIZE + value: 100M + - name: CASSANDRA_SEEDS + value: "hssdb-0.{{ .Values.hssdb.name }}.{{ .Values.global.namespace }}.{{ .Values.global.fqdn }}" + - name: CASSANDRA_CLUSTER_NAME + value: "HSS Cluster" + - name: CASSANDRA_RPC_ADDRESS + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: CASSANDRA_ENDPOINT_SNITCH + value: "GossipingPropertyFileSnitch" + readinessProbe: + exec: + command: ["/bin/bash", "-c", "nodetool status -r | awk -v h=$(hostname) '$2==h {exit ($1==\"UN\" ? 0 : -1)}'"] + initialDelaySeconds: 15 + timeoutSeconds: 5 + volumeMounts: + - name: hssdb-config + mountPath: /etc/cassandra/cassandra-rackdc.properties + subPath: cassandra-rackdc.properties + #- name: hssdb-data + # mountPath: /var/lib/cassandra + volumes: + - name: hssdb-config + configMap: + name: {{ .Values.hssdb.name }} +# volumeClaimTemplates: +# - metadata: +# name: hssdb-data +# spec: +# accessModes: [ "ReadWriteOnce" ] +# resources: +# requests: +# storage: 1Gi diff --git a/helm-charts/mcord-release/mcord-services/templates/mme.yaml b/helm-charts/mcord-release/mcord-services/templates/mme.yaml new file mode 100644 index 0000000..c6e6adb --- /dev/null +++ b/helm-charts/mcord-release/mcord-services/templates/mme.yaml @@ -0,0 +1,293 @@ +--- +# Copyright 2018-present Open Networking Foundation +# Copyright 2018 Intel Corporation +# +# 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. +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ .Values.mme.name }} +data: + launch.sh: | + #!/bin/bash + + cd /opt/c3po/mme/bin + cp /etc/mme/conf/{vbsm_cfg.txt,vbfd.conf} . + + # from vbsm_cfg.txt + SGW_S11_IP=${SGW_S11_IP:-sgw.localdomain} + ENB_S1AP_IP=${ENB_S1AP_IP:-enb1.localdomain} + ENB_S1AP_PORT=${ENB_S1AP_PORT:-36412} + MME_ETH0_IP=${MME_ETH0_IP:-0.0.0.0} + + # from vbfd.conf + HSS_CONNECT_PEER=${HSS_CONNECT_PEER:-hss.localdomain} + HSS_S6A_IP=${HSS_S6A_IP:-hss.localdomain} + HSS_PORT=${HSS_PORT:-3868} + VAR_HSS_REALM=${VAR_HSS_REALM:-openair4G.eur} + + sed -i "s/SGW_S11_IP/$(dig $SGW_S11_IP +short)/g" vbsm_cfg.txt + sed -i "s/ENB_S1AP_IP/$ENB_S1AP_IP/g" vbsm_cfg.txt + sed -i "s/ENB_S1AP_PORT/$ENB_S1AP_PORT/g" vbsm_cfg.txt + sed -i "s/MME_ETH0_IP/$MME_ETH0_IP/g" vbsm_cfg.txt + sed -i "s/VAR_HSS_HOST/$HSS_CONNECT_PEER/g" vbsm_cfg.txt + sed -i "s/VAR_HSS_REALM/$VAR_HSS_REALM/g" vbsm_cfg.txt + + MME_HOST=$(hostname) + MME_DOMAIN=$(dnsdomainname) + sed -i "s/HSS_CONNECT_PEER/$HSS_CONNECT_PEER/g" vbfd.conf + sed -i "s/HSS_S6A_IP/$HSS_S6A_IP/g" vbfd.conf + sed -i "s/HSS_PORT/$HSS_PORT/g" vbfd.conf + sed -i "s/MME_IDENTITY/$MME_HOST.$MME_DOMAIN/g" vbfd.conf + sed -i "s/MME_REALM/$MME_DOMAIN/g" vbfd.conf + sed -i "s/MME_HOST/$MME_HOST/g" vbfd.conf + + # generate the certs + ./make_certs.sh $MME_HOST $MME_DOMAIN + + # finally, launch + ./vb_acc + vbfd.conf: | + # -------- Test configuration --------- + + # Identity = "."; + Identity = "MME_IDENTITY"; + Realm = "MME_REALM"; + # Port = 3868; + # SecPort = 3869; + + ConnectPeer = "HSS_CONNECT_PEER" { ConnectTo = "HSS_S6A_IP"; No_TLS; port = HSS_PORT; }; + + # TLS_Cred = ".cert.pem", ".key.pem"; + TLS_Cred = "MME_HOST.cert.pem", + "MME_HOST.key.pem"; + TLS_CA = "cacert.pem"; + + LoadExtension = "/usr/local/lib/freeDiameter/dict_3gpp2_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_draftload_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_etsi283034_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc4004_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc4006bis_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc4072_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc4590_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc5447_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc5580_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc5777_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc5778_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc6734_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc6942_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc7155_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc7683_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc7944_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29061_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29128_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29154_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29173_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29212_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29214_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29215_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29217_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29229_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29272_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29273_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29329_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29336_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29337_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29338_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29343_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29344_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29345_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29368_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29468_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts32299_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_S6as6d.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_S6c.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_S6t.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_SGd.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_T6aT6bT7.fdx"; + vbsm_cfg.txt: | + # Configuration file for MME + + ##### NOTE: Please Do NOT change the order of the parameters ##### + + # EGTP related + VBSM_EG_DFLT_PORT 2123 # EGTP Default port + VBSM_EG_NONDFLT_PORT 2124 # EGTP Non Default port + VBSM_EG_S10_NONDFLT_PORT 2125 # EGTP Non Default + VBSM_EG_S3_NONDFLT_PORT 2126 # EGTP Non Default port for S3 interface towards SGSN + # port for S10 + VBSM_EG_DFLT_HOST_NAME "sutlej.ccin.ccpu.com" # EGTP host name + + # E-NodeB related + VBSM_ENB_ADDR_1 "ENB_S1AP_IP" # IP address of eNodeB + VBSM_ENB_PORT_1 "ENB_S1AP_PORT" # eNodeB port + #VBSM_ENB_ADDR_2 "172.26.20.180" # IP address of eNodeB + #VBSM_ENB_PORT_2 36422 # eNodeB port + + # MME related + VBSM_MME_IPADDR "MME_ETH0_IP" # MME IP address + VBSM_MME_S1AP_IPADDR "MME_ETH0_IP" # MME IP address associated with the S1AP interface + VBSM_MME_EGTP_IPADDR "MME_ETH0_IP" # MME IP address associated with the EGTP interface + VBSM_MME_SCTP_PORT 36412 # MME SCTP port + + VBSM_SGW_IPADDR "SGW_S11_IP" # SGW IP address + VBSM_PGW_IPADDR "192.168.1.105" # PDN-GW IP address + + VBSM_UE_NUM 1000 # Support 1000 UE's + VBSM_SCTP_UDP_SERV_TYPE 0 #service type,default 0 SCTP + + # Debug mask to be set; each represent + #different debug masks to be set (1 and 0 to unset) + #in the form |LVB_DBGMASK_INFO|LVB_DBGMASK_ERROR|LVB_DBGMASK_TRC|LVB_DBGMASK_MEM + + VBSM_MME_DBG_MASK 1111 + VBSM_DBG_MASK 1111 + VBSM_NW_INIATED_DETACH_TIMER 1000 + + VBSM_MCC_DIG1 2 + VBSM_MCC_DIG2 0 + VBSM_MCC_DIG3 8 + + VBSM_MNC_DIG1 0 + VBSM_MNC_DIG2 1 + VBSM_MNC_DIG3 -1 + + # Target PLMN ID format [ MCC + MNC], + is concatination operator + # If MNC has two digits, the last charater shall be 'f' + # Valid Configurations: 11223f, 112345. + VBSM_TARGET_MME_PLMN_ID 31310f + VBSM_TARGET_MME_IP_ADDR "192.25.1.100" + + VBSM_T3412 32 + + VBSM_SGSN_IP_ADDR "192.25.1.195" + + + VBSM_SGSN_PLMN_ID 31311f + + VBSM_FD_CFG "vbfd.conf" + VBSM_HSS_HOST "VAR_HSS_HOST" + VBSM_HSS_REALM "VAR_HSS_REALM" + + # set VBSM_DISABLE_EPC_DNS 0 - enable DNS, 1 - disable DNS + VBSM_DISABLE_EPC_DNS 1 + VBSM_DISABLE_EIA0 1 + VBSM_REL_CAP 1 + VBSM_MME_NAME "vmmestandalone" + VBSM_S1C_SCTP_INSTREAMS 10 + VBSM_S1C_SCTP_OUTSTREAMS 10 + VBSM_MAX_ENB 2 + VBSM_NO_OFGUMMEIS 1 + VBSM_MMECODE 1 + VBSM_MMEGRPID 1 + VBSM_NO_OF_TAI 1 + VBSM_TAI_LIST {{"{{1,2,0,8,0,1,1}}"}} + + VBSM_SMS_ROUTER_HOST "smsrouter.test3gpp.net" + VBSM_SMS_ROUTER_REALM "test3gpp.net" +--- +apiVersion: v1 +kind: Service +metadata: + name: mme +spec: + selector: + app: mme + clusterIP: None + ports: + - name: s11 + port: 2123 + protocol: UDP + - name: s1ap + port: 36412 + protocol: TCP + - name: s6a + port: 3868 + protocol: TCP +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: {{ .Values.mme.name }} + labels: + app: {{ .Values.mme.name }} +spec: + replicas: 1 + selector: + matchLabels: + app: {{ .Values.mme.name }} + serviceName: {{ .Values.mme.name | quote }} + template: + metadata: + labels: + app: {{ .Values.mme.name }} + spec: + # Insert iptable rules as MME implements a userspace SCTP stack + initContainers: + - name: init-mme + image: {{ .Values.mme.initimage }} + command: [ "sh", "-c"] + securityContext: + capabilities: + add: + - NET_ADMIN + args: + - iptables -A OUTPUT -p sctp --sport 36412 --chunk-types any ABORT -j DROP; + until nslookup hss-0.{{ .Values.hss.name }}.{{ .Values.global.namespace }}.{{ .Values.global.fqdn }}; + do echo "waiting for hss"; sleep 2; done; + containers: + - name: mme + image: {{ .Values.mme.image | quote }} + imagePullPolicy: {{ .Values.global.imagepullpolicy }} + env: + - name: SGW_S11_IP + value: cp-0.cp + - name: MME_ETH0_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: ENB_S1AP_IP + value: {{ .Values.enb.host | quote }} + - name: ENB_S1AP_PORT + value: {{ .Values.enb.port | quote }} + - name: HSS_CONNECT_PEER + value: hss-0.{{ .Values.hss.name }}.{{ .Values.global.namespace }}.{{ .Values.global.fqdn }} + - name: VAR_HSS_REALM + value: {{ .Values.hss.name }}.{{ .Values.global.namespace }}.{{ .Values.global.fqdn }} + - name: HSS_S6A_IP + value: hss-0.{{ .Values.hss.name }}.{{ .Values.global.namespace }}.{{ .Values.global.fqdn }} + - name: HSS_PORT + value: "3868" + stdin: true + tty: true + #command: [ "sleep", "3600"] + resources: + limits: + cpu: {{ .Values.mme.cpu | quote }} + memory: {{ .Values.mme.memory }} + volumeMounts: + - name: mme-script + mountPath: /opt/c3po/mme/bin/launch.sh + subPath: launch.sh + - name: mme-config + mountPath: /etc/mme/conf + volumes: + - name: mme-script + configMap: + name: {{ .Values.mme.name }} + defaultMode: 493 + - name: mme-config + configMap: + name: {{ .Values.mme.name }} + defaultMode: 420 diff --git a/helm-charts/mcord-release/mcord-services/templates/networks.yaml b/helm-charts/mcord-release/mcord-services/templates/networks.yaml new file mode 100644 index 0000000..b483fb1 --- /dev/null +++ b/helm-charts/mcord-release/mcord-services/templates/networks.yaml @@ -0,0 +1,41 @@ +--- +# Copyright 2018-present Open Networking Foundation +# Copyright 2018 Intel Corporation +# +# 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. + +{{- range .Values.networks }} +--- +apiVersion: "k8s.cni.cncf.io/v1" +kind: NetworkAttachmentDefinition +metadata: + name: {{ .name }} + annotations: + k8s.v1.cni.cncf.io/resourceName: intel.com/sriov +spec: + config: '{ + "type": {{ .sriovtype | quote }}, + "name": {{ .name | quote }}, + "ipam": { + "type": {{ .ipamtype | quote }}, + {{- if eq .ipamtype "host-local" }} + "subnet": {{ .subnet | quote }}, + "gateway": {{ .gateway | quote }} + {{- else if eq .ipamtype "centralip" }} + "ipType": "cluster", + "network": {{ .subnet | quote }}, + "etcdURL": {{ $.Values.global.etcdurl | quote }} + {{- end }} + } +}' +{{- end }} diff --git a/helm-charts/mcord-release/mcord-services/templates/spgwc.yaml b/helm-charts/mcord-release/mcord-services/templates/spgwc.yaml new file mode 100644 index 0000000..c965922 --- /dev/null +++ b/helm-charts/mcord-release/mcord-services/templates/spgwc.yaml @@ -0,0 +1,530 @@ +--- +# Copyright 2018-present Open Networking Foundation +# Copyright 2018 Intel Corporation +# +# 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. +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: spgwc-pod-reader +--- +kind: Role +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: pod-reader +rules: +- apiGroups: [""] + resources: ["pods"] + verbs: ["get"] +--- +kind: RoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: spgwc-pod-reader-rb +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: pod-reader +subjects: +- kind: ServiceAccount + name: spgwc-pod-reader +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ .Values.spgwc.name }} +data: + launch.sh: | + #!/bin/bash -xe + + RUN_DIR=${RUN_DIR:-"/opt/cp"} + mkdir -p $RUN_DIR/config + cd $RUN_DIR/config + cp /etc/cp/config/{adc_rules.cfg,cp_config.cfg,interface.cfg,meter_profile.cfg,pcc_rules.cfg,sdf_rules.cfg} . + sed -i "s/CP_ADDR/$CP_ADDR/g" interface.cfg + sed -i "s/DP_ADDR/$DP_ADDR/g" interface.cfg + . cp_config.cfg + ngic_controlplane $EAL_ARGS -- $APP_ARGS + cp_config.cfg: | + if [ ! -d "/dev/hugepages" ]; then + MEMORY="--no-huge -m $((MEM_LIMIT-1024))" + fi + SHARED_DIR="/opt/cp/config/shared" + if [ -d ${SHARED_DIR} ]; then + while [ ! -f ${SHARED_DIR}/SGW_S1U_IP ]; do echo "Waiting for SGW_S1U_IP"; sleep 2; done + SGW_S1U_IP=$(cat ${SHARED_DIR}/SGW_S1U_IP) + fi + + MGMT_INFO="-s ${CP_ADDR} -m ${MME_S11_IP} -w ${SGW_S1U_IP}" + APN_INFO="-i ${IP_POOL_IP} -p ${IP_POOL_MASK} -a ${APN}" + SPGW_CFG="-d 03 -l 2 -r 7.7.7.7 -g 6.6.6.6 -v 4.4.4.4 -u 5.5.5.5" + APP_ARGS="${MGMT_INFO} ${APN_INFO} ${SPGW_CFG} ${TEID_INFO}" + + CORES="-c $(taskset -p $$ | awk '{print $NF}')" + DEVICES="--no-pci" + EAL_ARGS="${CORES} ${MEMORY} ${DEVICES}" + interface.cfg: | + [0] + dp_comm_ip = DP_ADDR + dp_comm_port = 20 + cp_comm_ip = CP_ADDR + cp_comm_port = 21 + adc_rules.cfg: | + [GLOBAL] + NUM_ADC_RULES = 5 + + ;FORMAT :: + ;ADC_TYPE : [ DOMAIN = 0 | IP = 1 | IP PREFIX =2 ] + ; + ;if ADC_TYPE = 0 + ; DOMAIN + ;elseif ADC_TYPE = 1 + ; IP + ;elseif ADC_TYPE = 2 + ; IP + ; PREFIX + ;else + ; NONE + ; + ;NOTE : + ;Rules defined first have a higher priority, unless DROP is specified + ;(i.e. multiple rules for the same IP). + ;When specifying DROP with an IP address, use a prefix of 32 to prevent DNS + ;results from overwriting rule. + + + [ADC_RULE_1] + ADC_TYPE = 1 + IP = 13.1.1.111 + + [ADC_RULE_2] + ADC_TYPE = 2 + IP = 13.1.1.0 + PREFIX = 24 + + [ADC_RULE_3] + ADC_TYPE = 1 + IP = 13.1.1.112 + PREFIX = 24 + + [ADC_RULE_4] + ADC_TYPE = 0 + DOMAIN = www.example.gov + + [ADC_RULE_5] + ADC_TYPE = 0 + DOMAIN = www.drop_example.com + meter_profile.cfg: | + [GLOBAL] + NUM_OF_IDX = 7 + + [ENTRY_1] + ;Committed Information Rate (CIR). Measured in bytes per second. + ;MBR is mapped into CIR, convert MBR from bits to Bytes and set CIR. + CIR = 2342400 + ;Committed Burst Size unit = Bytes + CBS = 5856 + ;Excess Burst Size unit = Bytes + EBS = 11712 + ;Meter profile index. Refer this index in static_pcc.cfg to set AMBR/MBR + MTR_PROFILE_IDX = 3 + + [ENTRY_2] + ;1200 = 1756800 + ;1400 = 2049600 + ;1600 = 2342400 + CIR = 2342400 + CBS = 5856 + EBS = 11712 + MTR_PROFILE_IDX = 4 + + [ENTRY_3] + ; QCI5,QCI7 15.571kbps = 1947 B + CIR = 2342400 + CBS = 5856 + EBS = 11712 + MTR_PROFILE_IDX = 5 + + [ENTRY_4] + ; QCI1, 44kbps = 5500 B + CIR = 2342400 + CBS = 5856 + EBS = 11712 + MTR_PROFILE_IDX = 6 + + [ENTRY_5] + ; QCI9, 31.143kbps = 3893 B + CIR = 2342400 + CBS = 5856 + EBS = 11712 + MTR_PROFILE_IDX = 7 + + [ENTRY_6] + ; 128B, 7pps + CIR = 2342400 + CBS = 512 + EBS = 1024 + MTR_PROFILE_IDX = 8 + + [ENTRY_7] + ; 128B, 2pps + CIR = 2342400 + CBS = 512 + EBS = 1024 + MTR_PROFILE_IDX = 9 + + pcc_rules.cfg: | + [GLOBAL] + NUM_PCC_FILTERS = 9 + ;To config AMBR/MBR values refer meter_profile.cfg. specify only the + ;meter profile index to be set here. + UL_AMBR_MTR_PROFILE_IDX = 3 + DL_AMBR_MTR_PROFILE_IDX = 4 + + ;default filter - must be first for now (until DP doesn't install any filters) + ;associated with default adc rule + [PCC_FILTER_1] + RULE_NAME = DefaultRule + RATING_GROUP = 9 + SERVICE_ID = 0 + RULE_STATUS = 0 + GATE_STATUS = 1 + SESSION_CONT = 0 + REPORT_LEVEL = 1 + CHARGING_MODE = 0 + METERING_METHOD = 0 + MUTE_NOTIFY = 0 + MONITORING_KEY = 0 + SPONSOR_ID = 0 + REDIRECT_INFO = 0 + PRECEDENCE = 254 + DROP_PKT_COUNT = 0 + ;Specify the meter profile index from meter_profile.cfg + UL_MBR_MTR_PROFILE_IDX = 7 + DL_MBR_MTR_PROFILE_IDX = 7 + ;List of ADC filter indices + SDF_FILTER_IDX = 99998 + + [PCC_FILTER_2] + RULE_NAME = sdf_rule_1 + RATING_GROUP = 5 + SERVICE_ID = 0 + RULE_STATUS = 0 + GATE_STATUS = 1 + SESSION_CONT = 0 + REPORT_LEVEL = 2 + CHARGING_MODE = 0 + METERING_METHOD = 0 + MUTE_NOTIFY = 0 + MONITORING_KEY = 0 + SPONSOR_ID = 0 + REDIRECT_INFO = 0 + PRECEDENCE = 1 + DROP_PKT_COUNT = 0 + UL_MBR_MTR_PROFILE_IDX = 5 + DL_MBR_MTR_PROFILE_IDX = 5 + ;List of SDF filter indices + SDF_FILTER_IDX = 1 + + [PCC_FILTER_3] + RULE_NAME = sdf_rule_2 + RATING_GROUP = 1 + SERVICE_ID = 0 + RULE_STATUS = 0 + GATE_STATUS = 1 + SESSION_CONT = 0 + REPORT_LEVEL = 3 + CHARGING_MODE = 0 + METERING_METHOD = 0 + MUTE_NOTIFY = 0 + MONITORING_KEY = 0 + SPONSOR_ID = 0 + REDIRECT_INFO = 0 + PRECEDENCE = 18 + DROP_PKT_COUNT = 0 + UL_MBR_MTR_PROFILE_IDX = 6 + DL_MBR_MTR_PROFILE_IDX = 6 + ;List of SDF filter indices + SDF_FILTER_IDX = 2 + + [PCC_FILTER_4] + RULE_NAME = adc_rule_1 + RATING_GROUP = Zero-Rate + SERVICE_ID = Internet + RULE_STATUS = 0 + GATE_STATUS = 1 + SESSION_CONT = 0 + REPORT_LEVEL = 8 + CHARGING_MODE = 0 + METERING_METHOD = 0 + MUTE_NOTIFY = 0 + MONITORING_KEY = 0 + REDIRECT_INFO = 0 + SPONSOR_ID = Example + PRECEDENCE = 15 + DROP_PKT_COUNT = 0 + UL_MBR_MTR_PROFILE_IDX = 7 + DL_MBR_MTR_PROFILE_IDX = 7 + ;List of SDF filter indices + ADC_FILTER_IDX = 1 + + [PCC_FILTER_5] + RULE_NAME = adc_rule_2 + RATING_GROUP = 0 + SERVICE_ID = CIPA + RULE_STATUS = 0 + GATE_STATUS = 1 + SESSION_CONT = 0 + REPORT_LEVEL = 9 + CHARGING_MODE = 0 + METERING_METHOD = 0 + MUTE_NOTIFY = 0 + MONITORING_KEY = 0 + SPONSOR_ID = Example + REDIRECT_INFO = 0 + SPONSOR_ID = Example + REDIRECT_INFO = 0 + PRECEDENCE = 4 + DROP_PKT_COUNT = 0 + UL_MBR_MTR_PROFILE_IDX = 0 + DL_MBR_MTR_PROFILE_IDX = 0 + ;List of SDF filter indices + ADC_FILTER_IDX = 2 + + [PCC_FILTER_6] + RULE_NAME = sdf_rule_3 + RATING_GROUP = 7 + SERVICE_ID = 0 + RULE_STATUS = 0 + GATE_STATUS = 1 + SESSION_CONT = 0 + REPORT_LEVEL = 4 + CHARGING_MODE = 0 + METERING_METHOD = 0 + MUTE_NOTIFY = 0 + MONITORING_KEY = 0 + SPONSOR_ID = 0 + REDIRECT_INFO = 0 + PRECEDENCE = 17 + DROP_PKT_COUNT = 0 + UL_MBR_MTR_PROFILE_IDX = 5 + DL_MBR_MTR_PROFILE_IDX = 5 + ;List of SDF filter indices + SDF_FILTER_IDX = 3 + + [PCC_FILTER_7] + RULE_NAME = adc_rule_3 + RATING_GROUP = Zero-Rate + SERVICE_ID = Internet + RULE_STATUS = 0 + GATE_STATUS = 1 + SESSION_CONT = 0 + REPORT_LEVEL = 5 + CHARGING_MODE = 0 + METERING_METHOD = 0 + MUTE_NOTIFY = 0 + MONITORING_KEY = 0 + SPONSOR_ID = Example + REDIRECT_INFO = 0 + PRECEDENCE = 210 + DROP_PKT_COUNT = 0 + UL_MBR_MTR_PROFILE_IDX = 7 + DL_MBR_MTR_PROFILE_IDX = 7 + ;List of SDF filter indices + ADC_FILTER_IDX = 4 + + [PCC_FILTER_8] + RULE_NAME = adc_rule_4 + RATING_GROUP = Zero-Rate + SERVICE_ID = Management + RULE_STATUS = 0 + GATE_STATUS = 1 + SESSION_CONT = 0 + REPORT_LEVEL = 6 + CHARGING_MODE = 0 + METERING_METHOD = 0 + MUTE_NOTIFY = 0 + MONITORING_KEY = 0 + SPONSOR_ID = Example + REDIRECT_INFO = 0 + PRECEDENCE = 200 + DROP_PKT_COUNT = 0 + UL_MBR_MTR_PROFILE_IDX = 7 + DL_MBR_MTR_PROFILE_IDX = 7 + ;List of SDF filter indices + ADC_FILTER_IDX = 12 + + [PCC_FILTER_9] + RULE_NAME = adc_rule_5 + RATING_GROUP = Zero-Rate + SERVICE_ID = Provisioning + RULE_STATUS = 0 + GATE_STATUS = 1 + SESSION_CONT = 0 + REPORT_LEVEL = 7 + CHARGING_MODE = 0 + METERING_METHOD = 0 + MUTE_NOTIFY = 0 + MONITORING_KEY = 0 + SPONSOR_ID = Example + REDIRECT_INFO = 0 + PRECEDENCE = 220 + DROP_PKT_COUNT = 0 + UL_MBR_MTR_PROFILE_IDX = 7 + DL_MBR_MTR_PROFILE_IDX = 7 + ;List of SDF filter indices + ADC_FILTER_IDX = 3 + sdf_rules.cfg: | + [GLOBAL] + NUM_SDF_FILTERS = 4 + + [SDF_FILTER_1] + DIRECTION = downlink_only + IPV4_REMOTE = 13.2.1.113 + IPV4_REMOTE_MASK = 255.255.255.0 + PROTOCOL = 17 + LOCAL_LOW_LIMIT_PORT = 0 + LOCAL_HIGH_LIMIT_PORT = 65535 + REMOTE_LOW_LIMIT_PORT = 0 + REMOTE_HIGH_LIMIT_PORT = 65535 + + [SDF_FILTER_2] + DIRECTION = uplink_only + IPV4_LOCAL = 16.255.255.0 + IPV4_LOCAL_MASK = 255.255.255.0 + PROTOCOL = 17 + LOCAL_LOW_LIMIT_PORT = 0 + LOCAL_HIGH_LIMIT_PORT = 65535 + REMOTE_LOW_LIMIT_PORT = 0 + REMOTE_HIGH_LIMIT_PORT = 65535 + + [SDF_FILTER_3] + DIRECTION = downlink_only + IPV4_REMOTE = 130.10.0.0 + IPV4_REMOTE_MASK = 255.255.0.0 + PROTOCOL = 17 + REMOTE_LOW_LIMIT_PORT = 5060 + REMOTE_HIGH_LIMIT_PORT = 5060 + + [SDF_FILTER_4] + DIRECTION = uplink_only + IPV4_REMOTE = 103.1.0.0 + IPV4_REMOTE_MASK = 255.255.0.0 + PROTOCOL = 17 + LOCAL_LOW_LIMIT_PORT = 17000 + LOCAL_HIGH_LIMIT_PORT = 17010 +--- +apiVersion: v1 +kind: Service +metadata: + name: {{ .Values.spgwc.name }} +spec: + selector: + app: {{ .Values.spgwc.name }} + clusterIP: None + ports: + - name: s11 + port: 2123 + protocol: UDP + - name: cpdp + port: 21 + protocol: UDP +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: {{ .Values.spgwc.name }} + labels: + app: {{ .Values.spgwc.name }} +spec: + replicas: 1 + selector: + matchLabels: + app: {{ .Values.spgwc.name }} + serviceName: {{ .Values.spgwc.name | quote }} + template: + metadata: + labels: + app: {{ .Values.spgwc.name }} + spec: + serviceAccount: spgwc-pod-reader + initContainers: + - name: init-spgwc + image: {{ .Values.spgwc.initimage }} + command: ["/bin/sh", "-co", "pipefail"] + args: + - until $(kubectl get pod -ojson spgwu-0 2>/dev/null | jq -r '.metadata.annotations["k8s.v1.cni.cncf.io/networks-status"]' | jq -r '.[] | select(.name=="s1u-net") | .ips[0]' > /opt/cp/config/shared/SGW_S1U_IP); + do echo "waiting for SPGWU"; sleep 2; done + volumeMounts: + - name: shared-data + mountPath: /opt/cp/config/shared + containers: + - name: spgwc + image: {{ .Values.spgwc.image }} + imagePullPolicy: {{ .Values.global.imagepullpolicy }} + stdin: true + tty: true + command: ["/opt/cp/scripts/launch.sh"] + env: + - name: MEM_LIMIT + valueFrom: + resourceFieldRef: + containerName: spgwc + resource: limits.memory + divisor: 1Mi + #- name: SGW_S1U_IP + # value: "11.1.1.1" + - name: CP_ADDR + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: DP_ADDR + value: spgwu-0.{{ .Values.spgwu.name }}.{{ .Values.global.namespace }}.{{ .Values.global.fqdn }} + - name: MME_S11_IP + value: mme-0.{{ .Values.mme.name }}.{{ .Values.global.namespace }}.{{ .Values.global.fqdn }} + - name: APN + value: apn1 + - name: IP_POOL_IP + value: "16.0.0.0" + - name: IP_POOL_MASK + value: "255.0.0.0" + volumeMounts: + - name: cp-script + mountPath: /opt/cp/scripts/launch.sh + subPath: launch.sh + - name: cp-config + mountPath: /etc/cp/config + - name: shared-data + mountPath: /opt/cp/config/shared + #- name: hugepage + # mountPath: /dev/hugepages + resources: + limits: + #hugepages-2Mi: 4Gi + cpu: {{ .Values.spgwc.cpu | quote }} + memory: {{ .Values.spgwc.memory }} + volumes: + - name: cp-script + configMap: + name: {{ .Values.spgwc.name }} + defaultMode: 493 + - name: cp-config + configMap: + name: {{ .Values.spgwc.name }} + defaultMode: 420 + - name: shared-data + emptyDir: {} + #- name: hugepage + # emptyDir: + # medium: HugePages diff --git a/helm-charts/mcord-release/mcord-services/templates/spgwu.yaml b/helm-charts/mcord-release/mcord-services/templates/spgwu.yaml new file mode 100644 index 0000000..1c0c038 --- /dev/null +++ b/helm-charts/mcord-release/mcord-services/templates/spgwu.yaml @@ -0,0 +1,169 @@ +--- +# Copyright 2018-present Open Networking Foundation +# Copyright 2018 Intel Corporation +# +# 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. +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ .Values.spgwu.name }} +data: + launch.sh: | + #!/bin/bash -xe + + RUN_DIR=${RUN_DIR:-"/opt/dp"} + mkdir -p $RUN_DIR/config + cd $RUN_DIR/config + cp /etc/dp/config/{cdr.cfg,dp_config.cfg,interface.cfg} . + sed -i "s/CP_ADDR/$CP_ADDR/g" interface.cfg + sed -i "s/DP_ADDR/$DP_ADDR/g" interface.cfg + . dp_config.cfg + ngic_dataplane $EAL_ARGS -- $APP_ARGS + dp_config.cfg: | + if [ ! -d "/dev/hugepages" ]; then + MEMORY="--no-huge -m $((MEM_LIMIT-1024))" + fi + + CORES="-c $(taskset -p $$ | awk '{print $NF}')" + EAL_ARGS="${CORES} ${MEMORY} ${DEVICES}" + + SPGW_CFG="--spgw_cfg 03" + S1U_IP=$(ip -4 addr show dev ${S1U_DEVNAME} | grep -oP '(?<=inet\s)\d+(\.\d+){3}') + SGI_IP=$(ip -4 addr show dev ${SGI_DEVNAME} | grep -oP '(?<=inet\s)\d+(\.\d+){3}') + S1U_MAC=$(ip addr show dev ${S1U_DEVNAME} | awk '$1=="link/ether"{print $2}') + SGI_MAC=$(ip addr show dev ${SGI_DEVNAME} | awk '$1=="link/ether"{print $2}') + S1U="--s1u_ip ${S1U_IP} --s1u_mac ${S1U_MAC} --ul_iface ${S1U_DEVNAME}" + SGI="--sgi_ip ${SGI_IP} --sgi_mac ${SGI_MAC} --dl_iface ${SGI_DEVNAME} --sgi_gw_ip ${RTR_SGI_IP} --sgi_mask ${SGI_MASK}" + MISC="--log 1" + APP_ARGS="${S1U} ${SGI} ${MISC} ${SPGW_CFG}" + cdr.cfg: | + CDR_PATH=./cdr + MASTER_CDR=./cdr/master.csv + interface.cfg: | + [0] + dp_comm_ip = DP_ADDR + dp_comm_port = 20 + cp_comm_ip = CP_ADDR + cp_comm_port = 21 +--- +apiVersion: v1 +kind: Service +metadata: + name: {{ .Values.spgwu.name }} +spec: + selector: + app: {{ .Values.spgwu.name }} + clusterIP: None + ports: + - name: cpdp + port: 20 + protocol: UDP +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: {{ .Values.spgwu.name }} + labels: + app: {{ .Values.spgwu.name }} +spec: + replicas: 1 + selector: + matchLabels: + app: {{ .Values.spgwu.name }} + serviceName: {{ .Values.spgwu.name | quote }} + template: + metadata: + labels: + app: {{ .Values.spgwu.name }} + annotations: + k8s.v1.cni.cncf.io/networks: '[ + { "name": "s1u-net", "interface": "s1u-net" }, + { "name": "sgi-net", "interface": "sgi-net" } + ]' + spec: + # Required if working with Linux bound devices so that kernel does not + # reply to GTP-U packets + #initContainers: + #- name: init + # image: "ngick8stesting/c3po-init" + # command: [ "sh", "-xec"] + # securityContext: + # capabilities: + # add: + # - NET_ADMIN + # args: + # - iptables -I OUTPUT -p icmp --icmp-type destination-unreachable -j DROP; + containers: + - name: {{ .Values.spgwu.name }} + image: {{ .Values.spgwu.image }} + imagePullPolicy: {{ .Values.global.imagepullpolicy }} + stdin: true + tty: true + env: + - name: MEM_LIMIT + valueFrom: + resourceFieldRef: + containerName: {{ .Values.spgwu.name }} + resource: limits.memory + divisor: 1Mi + - name: S1U_DEVNAME + value: s1u-net + - name: SGI_DEVNAME + value: sgi-net + - name: DEVICES + value: "" # "--no-pci --vdev eth_af_packet0,iface=s1u-net --vdev eth_af_packet1,iface=sgi-net" + - name: CP_ADDR + value: spgwc-0.{{ .Values.spgwc.name }}.{{ .Values.global.namespace }}.{{ .Values.global.fqdn }} + - name: DP_ADDR + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: RTR_SGI_IP + value: "13.1.1.254" + - name: SGI_MASK + value: "255.255.255.0" + command: ["bash", "-xc"] + args: + - ip a; + /opt/dp/scripts/launch.sh; + volumeMounts: + - name: dp-script + mountPath: /opt/dp/scripts/launch.sh + subPath: launch.sh + - name: dp-config + mountPath: /etc/dp/config + #- name: hugepage + # mountPath: /dev/hugepages + resources: + limits: + #hugepages-1Gi: 8Gi + cpu: {{ .Values.spgwu.cpu | quote }} + memory: {{ .Values.spgwu.memory }} + intel.com/sriov: 2 + securityContext: + capabilities: + add: + - IPC_LOCK + volumes: + - name: dp-script + configMap: + name: {{ .Values.spgwu.name }} + defaultMode: 493 + - name: dp-config + configMap: + name: {{ .Values.spgwu.name }} + defaultMode: 420 + #- name: hugepage + # emptyDir: + # medium: HugePages diff --git a/helm-charts/mcord-release/mcord-services/values.yaml b/helm-charts/mcord-release/mcord-services/values.yaml new file mode 100644 index 0000000..65fab56 --- /dev/null +++ b/helm-charts/mcord-release/mcord-services/values.yaml @@ -0,0 +1,82 @@ +--- +# Copyright 2018-present Open Networking Foundation +# Copyright 2018 Intel Corporation +# +# 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. + +# Default values for M-CORD Services +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + + +# Global Block defines shared variables for all Kubernetes objects +# etcdurl: the etcd connection peer for centralIP network plugin +global: + namespace: default + fqdn: svc.cluster.local + imagepullpolicy: IfNotPresent + etcdurl: http://node1:32379 + +hssdb: + name: hssdb + image: krsna1729/c3po-hssdb + cpu: 3 + memory: 4Gi + +hss: + name: hss + initimage: krsna1729/c3po-hssdb + image: krsna1729/c3po-hss + cpu: 3 + memory: 1Gi + +mme: + name: mme + initimage: ngick8stesting/c3po-mmeinit + image: ngick8stesting/c3po-mme:5e2eaf6 + cpu: 3 + memory: 1Gi + +spgwc: + name: spgwc + initimage: ngick8stesting/kubectl + image: krsna1729/ngic-cp + cpu: 3 + memory: 5Gi + +spgwu: + name: spgwu + image: krsna1729/ngic-dp + cpu: 4 + memory: 8Gi + +enb: + host: 10.1.11.3 + port: 36412 + +# Network block defines the network used by SR-IOV pods +# ipamtype: defined the prefered IP management plugin (only support host-local or centralip) +# subnet: defined the customized network subnet range +# gateway: defined the default gateway for pod which attaches to current network +# this option will be ignored when using centralip as ipam plugin +networks: + - name: s1u-net + sriovtype: vfioveth + ipamtype: centralip + subnet: 119.0.0.0/24 + gateway: 119.0.0.254 + - name: sgi-net + sriovtype: vfioveth + ipamtype: centralip + subnet: 13.1.1.0/24 + gateway: 13.1.1.254 diff --git a/helm-charts/mcord-release/mcord-setup/.helmignore b/helm-charts/mcord-release/mcord-setup/.helmignore new file mode 100644 index 0000000..f0c1319 --- /dev/null +++ b/helm-charts/mcord-release/mcord-setup/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/helm-charts/mcord-release/mcord-setup/Chart.yaml b/helm-charts/mcord-release/mcord-setup/Chart.yaml new file mode 100644 index 0000000..ddbb3f3 --- /dev/null +++ b/helm-charts/mcord-release/mcord-setup/Chart.yaml @@ -0,0 +1,21 @@ +--- +# Copyright 2018-present Open Networking Foundation +# Copyright 2018 Intel Corporation +# +# 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. + +apiVersion: v1 +appVersion: "1.0" +description: The prerequisite setup of M-CORD +name: mcord-setup +version: 0.1.0 diff --git a/helm-charts/mcord-release/mcord-setup/templates/NOTES.txt b/helm-charts/mcord-release/mcord-setup/templates/NOTES.txt new file mode 100644 index 0000000..bc70b1d --- /dev/null +++ b/helm-charts/mcord-release/mcord-setup/templates/NOTES.txt @@ -0,0 +1,33 @@ +{{- /* +# Copyright 2018-present Open Networking Foundation +# Copyright 2018 Intel Corporation +# +# 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. +*/ -}} + +Congratulations! You have installed SR-IOV network device plugin into your Kubernetes cluster. + +Your configurations for SR-IOV network device plugin as following: + + 10-Gigabit NIC PCI address: {{ .Values.sriov.devicepci }} + SR-IOV device type: {{ .Values.sriov.devicetype }} + +You can run following command to check SR-IOV is working in Kubernetes cluster: + + $ kubectl -n kube-system -l name=sriov-device-plugin -o wide get pods + $ kubectl get nodes -o json | jq -r '.items[] | "\(.metadata.name): \(.status.allocatable)"' + + node1: {"cpu":"39800m","ephemeral-storage":"452697199891","hugepages-1Gi":"32Gi","intel.com/sriov":"63","memory":"31776336Ki","pods":"110"} + node2: {"cpu":"39800m","ephemeral-storage":"452697199891","hugepages-1Gi":"32Gi","intel.com/sriov":"63","memory":"31776336Ki","pods":"110"} + +The result should show "intel.com/sriov" resource is registered to cluster, and have some virtual function available here. diff --git a/helm-charts/mcord-release/mcord-setup/templates/_helpers.tpl b/helm-charts/mcord-release/mcord-setup/templates/_helpers.tpl new file mode 100644 index 0000000..aabdc98 --- /dev/null +++ b/helm-charts/mcord-release/mcord-setup/templates/_helpers.tpl @@ -0,0 +1,49 @@ +{{- /* +# Copyright 2018-present Open Networking Foundation +# Copyright 2018 Intel Corporation +# +# 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. +*/ -}} + +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "mcord-setup.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "mcord-setup.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "mcord-setup.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} diff --git a/helm-charts/mcord-release/mcord-setup/templates/multus-sriov-ds.yaml b/helm-charts/mcord-release/mcord-setup/templates/multus-sriov-ds.yaml new file mode 100644 index 0000000..135e769 --- /dev/null +++ b/helm-charts/mcord-release/mcord-setup/templates/multus-sriov-ds.yaml @@ -0,0 +1,234 @@ +--- +# Copyright 2018-present Open Networking Foundation +# Copyright 2018 Intel Corporation +# +# 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. +--- +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + # name must match the spec fields below, and be in the form: . + name: network-attachment-definitions.k8s.cni.cncf.io + annotations: + "helm.sh/hook": "crd-install" + "helm.sh/hook-delete-policy": "before-hook-creation" +spec: + # group name to use for REST API: /apis// + group: k8s.cni.cncf.io + # version name to use for REST API: /apis// + version: v1 + # either Namespaced or Cluster + scope: Namespaced + names: + # plural name to be used in the URL: /apis/// + plural: network-attachment-definitions + # singular name to be used as an alias on the CLI and for display + singular: network-attachment-definition + # kind is normally the CamelCased singular type. Your resource manifests use this. + kind: NetworkAttachmentDefinition + # shortNames allow shorter string to match your resource on the CLI + shortNames: + - net-attach-def +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: multus-sa + namespace: kube-system + annotations: + "helm.sh/hook": "pre-install" + "helm.sh/hook-delete-policy": "before-hook-creation" +--- +apiVersion: v1 +kind: Secret +metadata: + name: multus-sa-secret + namespace: kube-system + annotations: + kubernetes.io/service-account.name: multus-sa +type: kubernetes.io/service-account-token +--- +kind: ClusterRole +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: multus-pod-networks-lister +rules: +- apiGroups: [""] + resources: ["pods"] + verbs: ["get"] +- apiGroups: [""] + resources: ["pods/status"] + verbs: ["update"] +- apiGroups: ["k8s.cni.cncf.io"] + resources: ["*"] + verbs: ["get"] +--- +kind: ConfigMap +apiVersion: v1 +metadata: + name: multus-scripts + namespace: kube-system +data: + install-certs.sh: | + # Copied from Calico + # https://github.com/projectcalico/cni-plugin/blob/master/k8s-install/scripts/install-cni.sh + touch /host/etc/cni/net.d/multus-kubeconfig + chmod 600 /host/etc/cni/net.d/multus-kubeconfig + SERVICE_ACCOUNT_PATH=/var/run/secrets/multus/serviceaccount + KUBE_CA_FILE=$SERVICE_ACCOUNT_PATH/ca.crt + TLS_CFG="certificate-authority-data: $(cat $KUBE_CA_FILE | base64 | tr -d '\n')" + SERVICEACCOUNT_TOKEN=$(cat $SERVICE_ACCOUNT_PATH/token) + cat > /host/etc/cni/net.d/multus-kubeconfig < /host/etc/cni/net.d/00-multus.conf <. + name: network-attachment-definitions.k8s.cni.cncf.io +spec: + # group name to use for REST API: /apis// + group: k8s.cni.cncf.io + # version name to use for REST API: /apis// + version: v1 + # either Namespaced or Cluster + scope: Namespaced + names: + # plural name to be used in the URL: /apis/// + plural: network-attachment-definitions + # singular name to be used as an alias on the CLI and for display + singular: network-attachment-definition + # kind is normally the CamelCased singular type. Your resource manifests use this. + kind: NetworkAttachmentDefinition + # shortNames allow shorter string to match your resource on the CLI + shortNames: + - net-attach-def diff --git a/helm-charts/mcord/cni-config/03-network-definition.yaml b/helm-charts/mcord/cni-config/03-network-definition.yaml new file mode 100644 index 0000000..df9bf5e --- /dev/null +++ b/helm-charts/mcord/cni-config/03-network-definition.yaml @@ -0,0 +1,69 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +--- +apiVersion: "k8s.cni.cncf.io/v1" +kind: NetworkAttachmentDefinition +metadata: + name: s1u-net + annotations: + k8s.v1.cni.cncf.io/resourceName: intel.com/sriov +spec: + config: '{ + "type": "sriov", + "name": "s1u-net", + "ipam": { + "type": "centralip", + "ipType": "cluster", + "etcdURL": "http://node1:32379", + "network": "119.0.0.0/24" + } +}' +--- +apiVersion: "k8s.cni.cncf.io/v1" +kind: NetworkAttachmentDefinition +metadata: + name: sgi-net + annotations: + k8s.v1.cni.cncf.io/resourceName: intel.com/sriov +spec: + config: '{ + "type": "sriov", + "name": "sgi-net", + "ipam": { + "type": "centralip", + "ipType": "cluster", + "etcdURL": "http://node1:32379", + "network": "13.0.0.0/24" + } +}' +--- +apiVersion: "k8s.cni.cncf.io/v1" +kind: NetworkAttachmentDefinition +metadata: + name: bbu-net + annotations: + k8s.v1.cni.cncf.io/resourceName: intel.com/sriov +spec: + config: '{ + "type": "sriov", + "name": "bbu-net", + "ipam": { + "type": "centralip", + "ipType": "cluster", + "etcdURL": "http://node1:32379", + "network": "116.0.0.0/24" + } +}' diff --git a/helm-charts/mcord/cni-config/04-sriov-device-plugin-configmap.yaml b/helm-charts/mcord/cni-config/04-sriov-device-plugin-configmap.yaml new file mode 100644 index 0000000..a5f9d20 --- /dev/null +++ b/helm-charts/mcord/cni-config/04-sriov-device-plugin-configmap.yaml @@ -0,0 +1,92 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +--- +kind: ConfigMap +apiVersion: v1 +metadata: + name: multus-scripts + namespace: kube-system +data: + install-certs.sh: | + # Copied from Calico + # https://github.com/projectcalico/cni-plugin/blob/master/k8s-install/scripts/install-cni.sh + touch /host/etc/cni/net.d/multus-kubeconfig + chmod 600 /host/etc/cni/net.d/multus-kubeconfig + SERVICE_ACCOUNT_PATH=/var/run/secrets/kubernetes.io/serviceaccount + KUBE_CA_FILE=$SERVICE_ACCOUNT_PATH/ca.crt + TLS_CFG="certificate-authority-data: $(cat $KUBE_CA_FILE | base64 | tr -d '\n')" + SERVICEACCOUNT_TOKEN=$(cat $SERVICE_ACCOUNT_PATH/token) + cat > /host/etc/cni/net.d/multus-kubeconfig < /host/etc/cni/net.d/00-multus.conf < ${SHARED_DIR}/SGW_S1U_IP + else #dev --vdev af_packt + echo "vdev (AF_PACKET)" + # set the variables we provide + SGW_S1U_IP=$(netstat -ie | grep -A1 s1u-net | tail -1 | awk '{print $2}' | tr -d addr:) + SGW_SGI_IP=$(netstat -ie | grep -A1 sgi-net | tail -1 | awk '{print $2}' | tr -d addr:) + S1U_MAC=$( netstat -ie | grep -B1 $SGW_S1U_IP | head -n1 | awk '{print $5}' ) + SGI_MAC=$( netstat -ie | grep -B1 $SGW_SGI_IP | head -n1 | awk '{print $5}' ) + + DEVICES="--no-pci --vdev eth_af_packet0,iface=s1u-net --vdev eth_af_packet1,iface=sgi-net" + fi + + if [ ! -d "/dev/hugepages" ]; then + MEMORY="--no-huge -m $((MEM_LIMIT-1024))" + fi + + CORES="-c $(taskset -p $$ | awk '{print $NF}')" + SPGW_CFG="--spgw_cfg 03" + EAL_ARGS="${CORES} ${MEMORY} ${DEVICES}" + + S1U="--s1u_ip ${SGW_S1U_IP} --s1u_mac ${S1U_MAC}" + SGI="--sgi_ip ${SGW_SGI_IP} --sgi_mac ${SGI_MAC} --sgi_gw_ip ${RTR_SGI_IP} --sgi_mask ${SGI_MASK}" + WORKERS="--num_workers 1" + MISC="--log 1" + APP_ARGS="${S1U} ${SGI} ${WORKERS} ${MISC} ${SPGW_CFG}" + interface.cfg: | + [0] + dp_comm_ip = {{ .Values.spgwu_s11_ip }} + dp_comm_port = {{ .Values.spgwu_port }} + cp_comm_ip = 127.0.0.1 + cp_comm_port = 21 + meter_profile.cfg: | + [GLOBAL] + NUM_OF_IDX = 7 + + [ENTRY_1] + ;Committed Information Rate (CIR). Measured in bytes per second. + ;MBR is mapped into CIR, convert MBR from bits to Bytes and set CIR. + CIR = 2342400 + ;Committed Burst Size unit = Bytes + CBS = 5856 + ;Excess Burst Size unit = Bytes + EBS = 11712 + ;Meter profile index. Refer this index in static_pcc.cfg to set AMBR/MBR + MTR_PROFILE_IDX = 3 + + [ENTRY_2] + ;1200 = 1756800 + ;1400 = 2049600 + ;1600 = 2342400 + CIR = 2342400 + CBS = 5856 + EBS = 11712 + MTR_PROFILE_IDX = 4 + + [ENTRY_3] + ; QCI5,QCI7 15.571kbps = 1947 B + CIR = 2342400 + CBS = 5856 + EBS = 11712 + MTR_PROFILE_IDX = 5 + + [ENTRY_4] + ; QCI1, 44kbps = 5500 B + CIR = 2342400 + CBS = 5856 + EBS = 11712 + MTR_PROFILE_IDX = 6 + + [ENTRY_5] + ; QCI9, 31.143kbps = 3893 B + CIR = 2342400 + CBS = 5856 + EBS = 11712 + MTR_PROFILE_IDX = 7 + + [ENTRY_6] + ; 128B, 7pps + CIR = 2342400 + CBS = 512 + EBS = 1024 + MTR_PROFILE_IDX = 8 + + [ENTRY_7] + ; 128B, 2pps + CIR = 2342400 + CBS = 512 + EBS = 1024 + MTR_PROFILE_IDX = 9 + + pcc_rules.cfg: | + [GLOBAL] + NUM_PCC_FILTERS = 9 + ;To config AMBR/MBR values refer meter_profile.cfg. specify only the + ;meter profile index to be set here. + UL_AMBR_MTR_PROFILE_IDX = 3 + DL_AMBR_MTR_PROFILE_IDX = 4 + + ;default filter - must be first for now (until DP doesn't install any filters) + ;associated with default adc rule + [PCC_FILTER_1] + RULE_NAME = DefaultRule + RATING_GROUP = 9 + SERVICE_ID = 0 + RULE_STATUS = 0 + GATE_STATUS = 1 + SESSION_CONT = 0 + REPORT_LEVEL = 1 + CHARGING_MODE = 0 + METERING_METHOD = 0 + MUTE_NOTIFY = 0 + MONITORING_KEY = 0 + SPONSOR_ID = 0 + REDIRECT_INFO = 0 + PRECEDENCE = 254 + DROP_PKT_COUNT = 0 + ;Specify the meter profile index from meter_profile.cfg + UL_MBR_MTR_PROFILE_IDX = 7 + DL_MBR_MTR_PROFILE_IDX = 7 + ;List of ADC filter indices + SDF_FILTER_IDX = 99998 + + [PCC_FILTER_2] + RULE_NAME = sdf_rule_1 + RATING_GROUP = 5 + SERVICE_ID = 0 + RULE_STATUS = 0 + GATE_STATUS = 1 + SESSION_CONT = 0 + REPORT_LEVEL = 2 + CHARGING_MODE = 0 + METERING_METHOD = 0 + MUTE_NOTIFY = 0 + MONITORING_KEY = 0 + SPONSOR_ID = 0 + REDIRECT_INFO = 0 + PRECEDENCE = 1 + DROP_PKT_COUNT = 0 + UL_MBR_MTR_PROFILE_IDX = 5 + DL_MBR_MTR_PROFILE_IDX = 5 + ;List of SDF filter indices + SDF_FILTER_IDX = 1 + + [PCC_FILTER_3] + RULE_NAME = sdf_rule_2 + RATING_GROUP = 1 + SERVICE_ID = 0 + RULE_STATUS = 0 + GATE_STATUS = 1 + SESSION_CONT = 0 + REPORT_LEVEL = 3 + CHARGING_MODE = 0 + METERING_METHOD = 0 + MUTE_NOTIFY = 0 + MONITORING_KEY = 0 + SPONSOR_ID = 0 + REDIRECT_INFO = 0 + PRECEDENCE = 18 + DROP_PKT_COUNT = 0 + UL_MBR_MTR_PROFILE_IDX = 6 + DL_MBR_MTR_PROFILE_IDX = 6 + ;List of SDF filter indices + SDF_FILTER_IDX = 2 + + [PCC_FILTER_4] + RULE_NAME = adc_rule_1 + RATING_GROUP = Zero-Rate + SERVICE_ID = Internet + RULE_STATUS = 0 + GATE_STATUS = 1 + SESSION_CONT = 0 + REPORT_LEVEL = 8 + CHARGING_MODE = 0 + METERING_METHOD = 0 + MUTE_NOTIFY = 0 + MONITORING_KEY = 0 + REDIRECT_INFO = 0 + SPONSOR_ID = Example + PRECEDENCE = 15 + DROP_PKT_COUNT = 0 + UL_MBR_MTR_PROFILE_IDX = 7 + DL_MBR_MTR_PROFILE_IDX = 7 + ;List of SDF filter indices + ADC_FILTER_IDX = 1 + + [PCC_FILTER_5] + RULE_NAME = adc_rule_2 + RATING_GROUP = 0 + SERVICE_ID = CIPA + RULE_STATUS = 0 + GATE_STATUS = 1 + SESSION_CONT = 0 + REPORT_LEVEL = 9 + CHARGING_MODE = 0 + METERING_METHOD = 0 + MUTE_NOTIFY = 0 + MONITORING_KEY = 0 + SPONSOR_ID = Example + REDIRECT_INFO = 0 + SPONSOR_ID = Example + REDIRECT_INFO = 0 + PRECEDENCE = 4 + DROP_PKT_COUNT = 0 + UL_MBR_MTR_PROFILE_IDX = 0 + DL_MBR_MTR_PROFILE_IDX = 0 + ;List of SDF filter indices + ADC_FILTER_IDX = 2 + + [PCC_FILTER_6] + RULE_NAME = sdf_rule_3 + RATING_GROUP = 7 + SERVICE_ID = 0 + RULE_STATUS = 0 + GATE_STATUS = 1 + SESSION_CONT = 0 + REPORT_LEVEL = 4 + CHARGING_MODE = 0 + METERING_METHOD = 0 + MUTE_NOTIFY = 0 + MONITORING_KEY = 0 + SPONSOR_ID = 0 + REDIRECT_INFO = 0 + PRECEDENCE = 17 + DROP_PKT_COUNT = 0 + UL_MBR_MTR_PROFILE_IDX = 5 + DL_MBR_MTR_PROFILE_IDX = 5 + ;List of SDF filter indices + SDF_FILTER_IDX = 3 + + [PCC_FILTER_7] + RULE_NAME = adc_rule_3 + RATING_GROUP = Zero-Rate + SERVICE_ID = Internet + RULE_STATUS = 0 + GATE_STATUS = 1 + SESSION_CONT = 0 + REPORT_LEVEL = 5 + CHARGING_MODE = 0 + METERING_METHOD = 0 + MUTE_NOTIFY = 0 + MONITORING_KEY = 0 + SPONSOR_ID = Example + REDIRECT_INFO = 0 + PRECEDENCE = 210 + DROP_PKT_COUNT = 0 + UL_MBR_MTR_PROFILE_IDX = 7 + DL_MBR_MTR_PROFILE_IDX = 7 + ;List of SDF filter indices + ADC_FILTER_IDX = 4 + + [PCC_FILTER_8] + RULE_NAME = adc_rule_4 + RATING_GROUP = Zero-Rate + SERVICE_ID = Management + RULE_STATUS = 0 + GATE_STATUS = 1 + SESSION_CONT = 0 + REPORT_LEVEL = 6 + CHARGING_MODE = 0 + METERING_METHOD = 0 + MUTE_NOTIFY = 0 + MONITORING_KEY = 0 + SPONSOR_ID = Example + REDIRECT_INFO = 0 + PRECEDENCE = 200 + DROP_PKT_COUNT = 0 + UL_MBR_MTR_PROFILE_IDX = 7 + DL_MBR_MTR_PROFILE_IDX = 7 + ;List of SDF filter indices + ADC_FILTER_IDX = 12 + + [PCC_FILTER_9] + RULE_NAME = adc_rule_5 + RATING_GROUP = Zero-Rate + SERVICE_ID = Provisioning + RULE_STATUS = 0 + GATE_STATUS = 1 + SESSION_CONT = 0 + REPORT_LEVEL = 7 + CHARGING_MODE = 0 + METERING_METHOD = 0 + MUTE_NOTIFY = 0 + MONITORING_KEY = 0 + SPONSOR_ID = Example + REDIRECT_INFO = 0 + PRECEDENCE = 220 + DROP_PKT_COUNT = 0 + UL_MBR_MTR_PROFILE_IDX = 7 + DL_MBR_MTR_PROFILE_IDX = 7 + ;List of SDF filter indices + ADC_FILTER_IDX = 3 + sdf_rules.cfg: | + [GLOBAL] + NUM_SDF_FILTERS = 4 + + [SDF_FILTER_1] + DIRECTION = downlink_only + IPV4_REMOTE = 13.2.1.113 + IPV4_REMOTE_MASK = 255.255.255.0 + PROTOCOL = 17 + LOCAL_LOW_LIMIT_PORT = 0 + LOCAL_HIGH_LIMIT_PORT = 65535 + REMOTE_LOW_LIMIT_PORT = 0 + REMOTE_HIGH_LIMIT_PORT = 65535 + + [SDF_FILTER_2] + DIRECTION = uplink_only + IPV4_LOCAL = 16.255.255.0 + IPV4_LOCAL_MASK = 255.255.255.0 + PROTOCOL = 17 + LOCAL_LOW_LIMIT_PORT = 0 + LOCAL_HIGH_LIMIT_PORT = 65535 + REMOTE_LOW_LIMIT_PORT = 0 + REMOTE_HIGH_LIMIT_PORT = 65535 + + [SDF_FILTER_3] + DIRECTION = downlink_only + IPV4_REMOTE = 130.10.0.0 + IPV4_REMOTE_MASK = 255.255.0.0 + PROTOCOL = 17 + REMOTE_LOW_LIMIT_PORT = 5060 + REMOTE_HIGH_LIMIT_PORT = 5060 + + [SDF_FILTER_4] + DIRECTION = uplink_only + IPV4_REMOTE = 103.1.0.0 + IPV4_REMOTE_MASK = 255.255.0.0 + PROTOCOL = 17 + LOCAL_LOW_LIMIT_PORT = 17000 + LOCAL_HIGH_LIMIT_PORT = 17010 + +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: cassandra +data: + cassandra-rackdc.properties: | + dc=DC1 + rack=RAC1 + prefer_local=true +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: hss +data: + acl.conf: | + ALLOW_OLD_TLS *.cluster.local + hss.conf: | + # -------- Local --------- + # The first parameter in this section is Identity, which will be used to + # identify this peer in the Diameter network. The Diameter protocol mandates + # that the Identity used is a valid FQDN for the peer. This parameter can be + # omitted, in that case the framework will attempt to use system default value + # (as returned by hostname --fqdn). + Identity = "HSS_IDENTITY"; + + # In Diameter, all peers also belong to a Realm. If the realm is not specified, + # the framework uses the part of the Identity after the first dot. + Realm = "HSS_REALM"; + + + # This parameter is mandatory, even if it is possible to disable TLS for peers + # connections. A valid certificate for this Diameter Identity is expected. + TLS_Cred = "./conf/HSS_HOST.cert.pem", "./conf/HSS_HOST.key.pem"; + TLS_CA = "./conf/cacert.pem"; + + + # Disable use of TCP protocol (only listen and connect in SCTP) + # Default : TCP enabled + No_SCTP; + + + # This option is ignored if freeDiameter is compiled with DISABLE_SCTP option. + # Prefer TCP instead of SCTP for establishing new connections. + # This setting may be overwritten per peer in peer configuration blocs. + # Default : SCTP is attempted first. + Prefer_TCP; + + + # Disable use of IPv6 addresses (only IP) + # Default : IPv6 enabled + No_IPv6; + + + # Overwrite the number of SCTP streams. This value should be kept low, + # especially if you are using TLS over SCTP, because it consumes a lot of + # resources in that case. See tickets 19 and 27 for some additional details on + # this. + # Limit the number of SCTP streams + SCTP_streams = 3; + + + # By default, freeDiameter acts as a Diameter Relay Agent by forwarding all + # messages it cannot handle locally. This parameter disables this behavior. + NoRelay; + + + # Use RFC3588 method for TLS protection, where TLS is negociated after CER/CEA exchange is completed + # on the unsecure connection. The alternative is RFC6733 mechanism, where TLS protects also the + # CER/CEA exchange on a dedicated secure port. + # This parameter only affects outgoing connections. + # The setting can be also defined per-peer (see Peers configuration section). + # Default: use RFC6733 method with separate port for TLS. + + #TLS_old_method; + + + # Number of parallel threads that will handle incoming application messages. + # This parameter may be deprecated later in favor of a dynamic number of threads + # depending on the load. + AppServThreads = 4; + + # Specify the addresses on which to bind the listening server. This must be + # specified if the framework is unable to auto-detect these addresses, or if the + # auto-detected values are incorrect. Note that the list of addresses is sent + # in CER or CEA message, so one should pay attention to this parameter if some + # adresses should be kept hidden. + #ListenOn = "127.0.0.1"; + + Port = {{ .Values.hss.ports.s6a }}; + SecPort = {{ .Values.hss.ports.secs6a }}; + + LoadExtension = "acl_wl.fdx" : "./conf/acl.conf"; + + # -------- Extensions --------- + + #LoadExtension = "/usr/local/lib/freeDiameter/_sample.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/app_acct.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/app_diameap.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/app_radgw.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/app_redirect.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/app_sip.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/dbg_interactive.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/dbg_monitor.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/dbg_msg_dumps.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/dbg_msg_timings.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/dbg_rt.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_3gpp2_avps.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/dict_CreditControl.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/dict_CxDx.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/dict_Gx.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/dict_NAS.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/dict_Ro.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/dict_Rx.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/dict_S6mS6n.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/dict_SGd.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/dict_SLh.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/dict_Sd.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/dict_Sh.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/dict_T4.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/dict_T6aT6bT7.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/dict_Tsp.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/dict_dcca.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/dict_dcca_3gpp.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/dict_dcca_starent.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_draftload_avps.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/dict_eap.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_etsi283034_avps.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/dict_legacy_xml.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/dict_mip6a.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/dict_mip6i.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/dict_nas_mipv6.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/dict_nasreq.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc4004_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc4006bis_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc4072_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc4590_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc5447_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc5580_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc5777_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc5778_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc6734_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc6942_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc7155_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc7683_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc7944_avps.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/dict_sip.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29061_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29128_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29154_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29173_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29212_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29214_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29215_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29217_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29229_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29272_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29273_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29329_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29336_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29337_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29338_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29343_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29344_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29345_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29368_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29468_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts32299_avps.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/rt_busypeers.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/rt_default.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/rt_ereg.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/rt_ignore_dh.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/rt_load_balance.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/rt_randomize.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/rt_redirect.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/test_acct.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/test_app.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/test_hss.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/test_netemul.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/test_rt_any.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/test_sip.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/dict_Rf.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_S6as6d.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_S6t.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_S6c.fdx"; + + + # Load RFC4072 dictionary objects + #LoadExtension = "dict_eap.fdx"; + + # Load the Diameter EAP server extension (requires diameap.conf) + #LoadExtension = "app_diameap.fdx" : "diameap.conf"; + + # Load the Accounting Server extension (requires app_acct.conf) + #LoadExtension = "app_acct.fdx" : "app_acct.conf"; + + # -------- Peers --------- + + # The framework will actively attempt to establish and maintain a connection + # with the peers listed here. + # For only accepting incoming connections, see the acl_wl.fx extension. + + #ConnectPeer = "peer1.localdomain" { ConnectTo = "127.0.0.1"; }; + hss.json: | + {"common": { + "fdcfg": "conf/hss.conf", + "originhost": "HSS_IDENTITY", + "originrealm": "HSS_REALM" + }, + "hss": { + "gtwhost": "*", + "gtwport" : 9080, + "restport" : 9081, + "casssrv": "CASSANDRA_ADDR", + "cassusr": "root", + "casspwd": "root", + "cassdb" : "vhss", + "randv" : true, + "optkey" : "63bfa50ee6523365ff14c1f45f88737d", + "reloadkey" : true + } + } + launch.sh: | + #!/bin/bash + + cd /opt/c3po/hss + cp /etc/hss/conf/{acl.conf,hss.json,hss.conf} conf + + HSS_HOST=$(hostname) + HSS_DOMAIN=$(dnsdomainname) + CASSANDRA_ADDR=${CASSANDRA_ADDR:-localhost} + + # from hss.json + sed -i "s/HSS_IDENTITY/$HSS_HOST.$HSS_DOMAIN/g" conf/hss.json + sed -i "s/HSS_REALM/$HSS_DOMAIN/g" conf/hss.json + sed -i "s/CASSANDRA_ADDR/$CASSANDRA_ADDR/g" conf/hss.json + + # from hss.conf + sed -i "s/HSS_IDENTITY/$HSS_HOST.$HSS_DOMAIN/g" conf/hss.conf + sed -i "s/HSS_REALM/$HSS_DOMAIN/g" conf/hss.conf + sed -i "s/HSS_HOST/$HSS_HOST/g" conf/hss.conf + + # If necessary, calculate the OPc value for each UE (User Equipment). + #./bin/hss -j conf/hss.json --onlyloadkey + + cd conf + make_certs.sh $(hostname) $(dnsdomainname) + cd .. + + # finally, launch + hss -j conf/hss.json +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: mme +data: + launch.sh: | + #!/bin/bash + + cd /opt/c3po/mme/bin + cp /etc/mme/conf/{vbsm_cfg.txt,vbfd.conf} . + + # from vbsm_cfg.txt + SGW_S11_IP=${SGW_S11_IP:-sgw.localdomain} + ENB_S1AP_IP=${ENB_S1AP_IP:-enb1.localdomain} + ENB_S1AP_PORT=${ENB_S1AP_PORT:-36412} + MME_ETH0_IP=${MME_ETH0_IP:-0.0.0.0} + + # from vbfd.conf + CONNECT_PEER=${CONNECT_PEER:-hss.localdomain} + HSS_S6A_IP=${HSS_S6A_IP:-hss.localdomain} + HSS_PORT=${HSS_PORT:-3868} + VAR_HSS_REALM=${VAR_HSS_REALM:-openair4G.eur} + + + sed -i "s/SGW_S11_IP/$(dig $SGW_S11_IP +short)/g" vbsm_cfg.txt + sed -i "s/ENB_S1AP_IP/$ENB_S1AP_IP/g" vbsm_cfg.txt + sed -i "s/ENB_S1AP_PORT/$ENB_S1AP_PORT/g" vbsm_cfg.txt + sed -i "s/MME_ETH0_IP/$MME_ETH0_IP/g" vbsm_cfg.txt + sed -i "s/VAR_HSS_HOST/$CONNECT_PEER/g" vbsm_cfg.txt + sed -i "s/VAR_HSS_REALM/$VAR_HSS_REALM/g" vbsm_cfg.txt + + + MME_HOST=$(hostname) + MME_DOMAIN=$(dnsdomainname) + sed -i "s/CONNECT_PEER/$CONNECT_PEER/g" vbfd.conf + sed -i "s/HSS_S6A_IP/$HSS_S6A_IP/g" vbfd.conf + sed -i "s/HSS_PORT/$HSS_PORT/g" vbfd.conf + sed -i "s/MME_IDENTITY/$MME_HOST.$MME_DOMAIN/g" vbfd.conf + sed -i "s/MME_REALM/$MME_DOMAIN/g" vbfd.conf + sed -i "s/MME_HOST/$MME_HOST/g" vbfd.conf + + # generate the certs + # ./make_certs.sh mme localdomain + ./make_certs.sh $MME_HOST $MME_DOMAIN + + + # finally, launch + ./vb_acc + vbfd.conf: | + # -------- Test configuration --------- + + # Identity = "."; + Identity = "MME_IDENTITY"; + Realm = "MME_REALM"; + # Port = 3868; + # SecPort = 3869; + + ConnectPeer = "CONNECT_PEER" { ConnectTo = "HSS_S6A_IP"; No_TLS; port = HSS_PORT; }; + + # TLS_Cred = ".cert.pem", ".key.pem"; + TLS_Cred = "MME_HOST.cert.pem", + "MME_HOST.key.pem"; + TLS_CA = "cacert.pem"; + + LoadExtension = "/usr/local/lib/freeDiameter/dict_3gpp2_avps.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/dict_CreditControl.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/dict_base_rfc6733.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_draftload_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_etsi283034_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc4004_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc4006bis_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc4072_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc4590_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc5447_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc5580_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc5777_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc5778_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc6734_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc6942_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc7155_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc7683_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc7944_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29061_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29128_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29154_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29173_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29212_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29214_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29215_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29217_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29229_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29272_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29273_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29329_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29336_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29337_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29338_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29343_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29344_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29345_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29368_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29468_avps.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_ts32299_avps.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/dict_CxDx.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/dict_Gx.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/dict_NAS.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/dict_Rf.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/dict_Ro.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/dict_Rx.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_S6as6d.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_S6c.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/dict_S6mS6n.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_S6t.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/dict_S9.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_SGd.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/dict_SLh.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/dict_Sd.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/dict_Sh.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/dict_T4.fdx"; + LoadExtension = "/usr/local/lib/freeDiameter/dict_T6aT6bT7.fdx"; + #LoadExtension = "/usr/local/lib/freeDiameter/dict_Tsp.fdx"; + vbsm_cfg.txt: | + # Configuration file for MME + + ##### NOTE: Please Do NOT change the order of the parameters ##### + + # EGTP related + VBSM_EG_DFLT_PORT 2123 # EGTP Default port + VBSM_EG_NONDFLT_PORT 2124 # EGTP Non Default port + VBSM_EG_S10_NONDFLT_PORT 2125 # EGTP Non Default + VBSM_EG_S3_NONDFLT_PORT 2126 # EGTP Non Default port for S3 interface towards SGSN + # port for S10 + VBSM_EG_DFLT_HOST_NAME "sutlej.ccin.ccpu.com" # EGTP host name + + + # E-NodeB related + VBSM_ENB_ADDR_1 "ENB_S1AP_IP" # IP address of eNodeB + VBSM_ENB_PORT_1 "ENB_S1AP_PORT" # eNodeB port + #VBSM_ENB_ADDR_2 "172.26.20.180" # IP address of eNodeB + #VBSM_ENB_PORT_2 36422 # eNodeB port + + # MME related + VBSM_MME_IPADDR "MME_ETH0_IP" # MME IP address + VBSM_MME_S1AP_IPADDR "MME_ETH0_IP" # MME IP address associated with the S1AP interface + VBSM_MME_EGTP_IPADDR "MME_ETH0_IP" # MME IP address associated with the EGTP interface + VBSM_MME_SCTP_PORT {{ .Values.mme.ports.s1ap }} # MME SCTP port + + VBSM_SGW_IPADDR "SGW_S11_IP" # SGW IP address + VBSM_PGW_IPADDR "192.168.1.105" # PDN-GW IP address + + VBSM_UE_NUM 1000 # Support 1000 UE's + VBSM_SCTP_UDP_SERV_TYPE 0 #service type,default 0 SCTP + + # Debug mask to be set; each represent + #different debug masks to be set (1 and 0 to unset) + #in the form |LVB_DBGMASK_INFO|LVB_DBGMASK_ERROR|LVB_DBGMASK_TRC|LVB_DBGMASK_MEM + + VBSM_MME_DBG_MASK 1111 + VBSM_DBG_MASK 1111 + VBSM_NW_INIATED_DETACH_TIMER 1000 + + VBSM_MCC_DIG1 3 + VBSM_MCC_DIG2 0 + VBSM_MCC_DIG3 2 + + VBSM_MNC_DIG1 7 + VBSM_MNC_DIG2 2 + VBSM_MNC_DIG3 0 + + # Target PLMN ID format [ MCC + MNC], + is concatination operator + # If MNC has two digits, the last charater shall be 'f' + # Valid Configurations: 11223f, 112345. + VBSM_TARGET_MME_PLMN_ID 31310f + VBSM_TARGET_MME_IP_ADDR "192.25.1.100" + + VBSM_T3412 0 + + VBSM_SGSN_IP_ADDR "192.25.1.195" + + + VBSM_SGSN_PLMN_ID 31311f + + VBSM_FD_CFG "vbfd.conf" + VBSM_HSS_HOST "VAR_HSS_HOST" + VBSM_HSS_REALM "VAR_HSS_REALM" + + # set VBSM_DISABLE_EPC_DNS 0 - enable DNS, 1 - disable DNS + VBSM_DISABLE_EPC_DNS 1 + VBSM_DISABLE_EIA0 1 + VBSM_REL_CAP 1 + VBSM_MME_NAME "vmmestandalone" + VBSM_S1C_SCTP_INSTREAMS 10 + VBSM_S1C_SCTP_OUTSTREAMS 10 + VBSM_MAX_ENB 2 + VBSM_NO_OFGUMMEIS 1 + VBSM_MMECODE 1 + VBSM_MMEGRPID 1 + VBSM_NO_OF_TAI 1 + VBSM_TAI_LIST {{"{{ 1,2,0,8,0,1,1 }}"}} + + VBSM_SMS_ROUTER_HOST "smsrouter.test3gpp.net" + VBSM_SMS_ROUTER_REALM "test3gpp.net" diff --git a/helm-charts/mcord/mcord-control-plane/templates/cp.yaml b/helm-charts/mcord/mcord-control-plane/templates/cp.yaml new file mode 100644 index 0000000..37ae75f --- /dev/null +++ b/helm-charts/mcord/mcord-control-plane/templates/cp.yaml @@ -0,0 +1,133 @@ +--- +# Copyright 2018-present Open Networking Foundation +# Copyright 2018 Intel Corporation +# +# 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. + +--- +apiVersion: v1 +kind: Service +metadata: + name: ngic-cp +spec: + selector: + app: ngic-cp + clusterIP: None + ports: + - name: s11 + port: {{ .Values.ngic_cp.ports.s11 }} + protocol: UDP + - name: sx + port: {{ .Values.ngic_cp.ports.sx }} + protocol: UDP +--- +apiVersion: v1 +kind: Service +metadata: + name: ngic-cp-external +spec: + selector: + app: ngic-cp + type: NodePort + ports: + - name: sx + port: {{ .Values.ngic_cp.ports.sx }} + nodePort: {{ .Values.ngic_cp.ports.sx_external }} + protocol: UDP +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: ngic-cp + labels: + app: ngic-cp +spec: + replicas: {{ .Values.ngic_cp.replicas }} + selector: + matchLabels: + app: ngic-cp + serviceName: "ngic-cp" + template: + metadata: + labels: + app: ngic-cp + spec: + nodeSelector: + kubernetes.io/hostname: "{{ .Values.spgwc_node_selector }}" + initContainers: + - name: init-iptables + image: {{ .Values.ngic_cp.images.init }} + command: [ "sh", "-c"] + securityContext: + capabilities: + add: + - NET_ADMIN + args: + - iptables -I OUTPUT -p icmp --icmp-type destination-unreachable -j DROP; + terminationGracePeriodSeconds: 1 + containers: + - name: ngic + image: {{ .Values.ngic_cp.images.cp }} + imagePullPolicy: IfNotPresent + stdin: true + command: [ "bash", "-xc" ] + args: + - . /opt/ngic/config/cp_config.cfg; + sleep 20; + ./ngic_controlplane $EAL_ARGS -- $APP_ARGS; + tty: true + env: + - name: MME_S11_IP + value: {{ .Values.mme_hostname }} + - name: SGW_S11_IP + value: {{ .Values.spgwc_hostname }} + - name: SGW_S1U_IP + value: {{ .Values.spgwu_s1u_ip }} + - name: APN + value: {{ .Values.ngic_cp.config.apn }} + - name: IP_POOL_IP + value: "{{ .Values.ngic_cp.config.ue_ip_pool }}" + - name: IP_POOL_MASK + value: "{{ .Values.ngic_cp.config.ue_ip_pool_mask }}" + - name: S11_TEID_POOL_START + value: "00100000" + - name: S11_TEID_POOL_STOP + value: "001fffff" + - name: S1U_TEID_POOL_START + value: "00100000" + - name: S1U_TEID_POOL_STOP + value: "001fffff" + - name: MEM_LIMIT + valueFrom: + resourceFieldRef: + containerName: ngic + resource: limits.memory + divisor: 1Mi + volumeMounts: + - name: config-volume + mountPath: /opt/ngic/config + #- name: hugepage + # mountPath: /dev/hugepages + - name: shared-data + mountPath: /opt/ngic/config/shared + resources: + limits: + #hugepages-1Gi: 4Gi + cpu: {{ .Values.ngic_cp.resources.cpu }} + memory: {{ .Values.ngic_cp.resources.mem }} + volumes: + - name: config-volume + configMap: + name: ngiccp-config + - name: shared-data + emptyDir: {} diff --git a/helm-charts/mcord/mcord-control-plane/templates/hss.yaml b/helm-charts/mcord/mcord-control-plane/templates/hss.yaml new file mode 100644 index 0000000..9dd3918 --- /dev/null +++ b/helm-charts/mcord/mcord-control-plane/templates/hss.yaml @@ -0,0 +1,93 @@ +--- +# Copyright 2018-present Open Networking Foundation +# Copyright 2018 Intel Corporation +# +# 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. + +--- +apiVersion: v1 +kind: Service +metadata: + name: hss +spec: + selector: + app: hss + clusterIP: None + ports: + - name: s6a + port: {{ .Values.hss.ports.s6a }} + protocol: TCP +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: hss + labels: + app: hss +spec: + replicas: {{ .Values.hss.replicas }} + selector: + matchLabels: + app: hss + serviceName: "hss" + template: + metadata: + labels: + app: hss + spec: + nodeSelector: + kubernetes.io/hostname: "{{ .Values.hss_node_selector }}" + terminationGracePeriodSeconds: 1 + initContainers: + - name: init-db + image: {{ .Values.hss.images.init }} + command: ["bash", "-xc"] + args: + - until nslookup {{ .Values.hssdb_hostname }}; do echo "waiting for cassandra domain name resolve."; sleep 2; done; + until cqlsh -e "show version" {{ .Values.hssdb_hostname }}; do echo "waiting for cassandra database ready."; sleep 2; done; + until cqlsh --file /scripts/oai_db.cql {{ .Values.hssdb_hostname }}; do echo "Writing data into database failed. Retrying ..."; sleep 2; done; + /scripts/data_provisioning_users.sh 302720100000420 1122334456 apn1 6226194254742F2D67145153602F7C8D 1 {{ .Values.hssdb_hostname }} {{ .Values.mme_hostname }} {{ .Values.mme_hostname }}; + /scripts/data_provisioning_users.sh 302720100000421 1122334456 apn1 6226194254742F2D67145153602F7C8D 1 {{ .Values.hssdb_hostname }} {{ .Values.mme_hostname }} {{ .Values.mme_hostname }}; + cqlsh -e "use vhss; update users_imsi set opc='D6CAF10C337FD65AC31A18EBACBF5BF9' where imsi='302720100000420';" {{ .Values.hssdb_hostname }}; + cqlsh -e "use vhss; update users_imsi set opc='D6CAF10C337FD65AC31A18EBACBF5BF9' where imsi='302720100000421';" {{ .Values.hssdb_hostname }}; + /scripts/data_provisioning_mme.sh 1 19136246000 mme-0.{{ .Values.mme_hostname }}.{{ .Values.namespace }}.svc.cluster.local {{ .Values.mme_hostname }}.{{ .Values.namespace }}.svc.cluster.local 1 {{ .Values.hssdb_hostname }}; + /scripts/data_provisioning_mme.sh 1 19136246000 smsrouter.test3gpp.net test3gpp.net 0 {{ .Values.hssdb_hostname }}; + containers: + - name: hss + image: {{ .Values.hss.images.hss }} + imagePullPolicy: Always + env: + - name: CASSANDRA_ADDR + value: {{ .Values.hssdb_hostname }} + - name: MME_ADDR + value: mme-0.{{ .Values.mme_hostname }}.{{ .Values.namespace }}.svc.cluster.local + #command: [ "sleep", "3600"] + resources: + limits: + cpu: {{ .Values.hss.resources.cpu }} + memory: {{ .Values.hss.resources.mem }} + volumeMounts: + - name: hss-script + mountPath: /opt/c3po/hss/launch.sh + subPath: launch.sh + - name: hss-config + mountPath: /etc/hss/conf + volumes: + - name: hss-script + configMap: + name: hss + defaultMode: 493 + - name: hss-config + configMap: + name: hss + defaultMode: 420 diff --git a/helm-charts/mcord/mcord-control-plane/templates/mme.yaml b/helm-charts/mcord/mcord-control-plane/templates/mme.yaml new file mode 100644 index 0000000..9685c82 --- /dev/null +++ b/helm-charts/mcord/mcord-control-plane/templates/mme.yaml @@ -0,0 +1,121 @@ +--- +# Copyright 2018-present Open Networking Foundation +# Copyright 2018 Intel Corporation +# +# 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. + +--- +apiVersion: v1 +kind: Service +metadata: + name: mme +spec: + selector: + app: mme + clusterIP: None + ports: + - name: s1ap + port: {{ .Values.mme.ports.s1ap }} + protocol: SCTP +--- +apiVersion: v1 +kind: Service +metadata: + name: mme-external +spec: + selector: + app: mme + type: NodePort + ports: + - name: s1ap + port: {{ .Values.mme.ports.s1ap }} + nodePort: {{ .Values.mme.ports.s1ap_external }} + protocol: SCTP +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: mme + labels: + app: mme +spec: + replicas: {{ .Values.mme.replicas }} + selector: + matchLabels: + app: mme + serviceName: "mme" + template: + metadata: + labels: + app: mme + spec: + nodeSelector: + kubernetes.io/hostname: "{{ .Values.mme_node_selector }}" + terminationGracePeriodSeconds: 1 + initContainers: + - name: init-mme + image: {{ .Values.mme.images.init }} + command: [ "sh", "-c"] + securityContext: + privileged: true + capabilities: + add: + - NET_ADMIN + args: + - until nslookup {{ .Values.hss_hostname }}; do echo waiting for hss; sleep 2; done; + iptables -A OUTPUT -p sctp --sport {{ .Values.mme.ports.s1ap }} --chunk-types any ABORT -j DROP; + containers: + - name: mme + image: {{ .Values.mme.images.mme }} + imagePullPolicy: Always + env: + - name: SGW_S11_IP + value: {{ .Values.spgwc_hostname }}.{{ .Values.namespace }}.svc.cluster.local + - name: MME_ETH0_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: ENB_S1AP_IP + value: {{ .Values.accelleran_hostname }} + - name: ENB_S1AP_PORT + value: "{{ .Values.accelleran_port }}" #ng4t uses 32767 + - name: CONNECT_PEER + value: hss-0.{{ .Values.hss_hostname }}.{{ .Values.namespace }}.svc.cluster.local + - name: VAR_HSS_REALM + value: {{ .Values.hss_hostname }}.{{ .Values.namespace }}.svc.cluster.local + - name: HSS_S6A_IP + value: hss-0.{{ .Values.hss_hostname }}.{{ .Values.namespace }}.svc.cluster.local + - name: HSS_PORT + value: "{{ .Values.mme.ports.s6a }}" + stdin: true + tty: true + #command: [ "sleep", "3600"] + resources: + limits: + cpu: {{ .Values.mme.resources.cpu }} + memory: {{ .Values.mme.resources.mem }} + volumeMounts: + - name: mme-script + mountPath: /opt/c3po/mme/bin/launch.sh + subPath: launch.sh + - name: mme-config + mountPath: /etc/mme/conf + volumes: + - name: mme-script + configMap: + name: mme + defaultMode: 493 + - name: mme-config + configMap: + name: mme + defaultMode: 420 diff --git a/helm-charts/mcord/mcord-control-plane/values.yaml b/helm-charts/mcord/mcord-control-plane/values.yaml new file mode 100644 index 0000000..e226c0f --- /dev/null +++ b/helm-charts/mcord/mcord-control-plane/values.yaml @@ -0,0 +1,88 @@ +--- +# Copyright 2018-present Open Networking Foundation +# Copyright 2018 Intel Corporation +# +# 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. + +# Default values for mcord-vepc-helm. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +hssdb_hostname: "cassandra" +hss_hostname: "hss" +mme_hostname: "mme" +spgwc_hostname: "ngic-cp" +# If the control plane is installed in a separate cluster, this value needs to be overridden +# DP installed on LOCAL node3 +spgwu_s11_ip: "10.90.0.133" +# The spgwu_s1u_ip changes everytime, you can get it with this command: +# ngic_sriov=$(kubectl exec -n epc ngic-dp-0 ifconfig s1u-net | grep 'inet addr' | cut -d: -f2 | awk '{print $1}') +# and use it in the chart with --set spgwu_s1u_ip=$ngic_sriov +spgwu_s1u_ip: "119.0.0.45" +spgwu_port: 31310 +# BBU is allocated on LOCAL's node2, use node2's IP +accelleran_hostname: "10.90.0.132" +accelleran_port: 31412 + +hssdb_node_selector: node3 +hss_node_selector: node3 +mme_node_selector: node2 +spgwc_node_selector: node2 + + +hss: + # TODO: init UE's IMEI to DB? + images: + init: "node1:30500/ngick8stesting/c3po-cassandra:5e2eaf6" + hss: "node1:30500/ngick8stesting/c3po-hss:5e2eaf6" + ports: + s6a: 3868 + secs6a: 5868 + replicas: 1 + resources: + cpu: 3 + mem: "1Gi" + +mme: + images: + init: "ngick8stesting/c3po-mmeinit" + mme: "ngick8stesting/c3po-mme:mwca-mme-debug" + ports: + s11: 2123 + s1ap: 36412 + s6a: 3868 + s1ap_external: 31412 + replicas: 1 + enb_s1ap_ip: "119.0.0.10" + resources: + cpu: 3 + mem: "1Gi" + +ngic_cp: + images: + init: "ngick8stesting/c3po-mmeinit" + cp: "node1:30500/ngick8stesting/ngic-cp:690f418" + replicas: 1 + ports: + s11: 2123 + sx: 21 + sx_external: 31311 + config: + apn: "apn1" + ue_ip_pool: "16.0.0.0" + ue_ip_pool_mask: "255.240.0.0" + resources: + cpu: 3 + mem: "5Gi" + +namespace: epc diff --git a/helm-charts/mcord/mcord-data-plane/.helmignore b/helm-charts/mcord/mcord-data-plane/.helmignore new file mode 100644 index 0000000..f0c1319 --- /dev/null +++ b/helm-charts/mcord/mcord-data-plane/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/helm-charts/mcord/mcord-data-plane/Chart.yaml b/helm-charts/mcord/mcord-data-plane/Chart.yaml new file mode 100644 index 0000000..fcdd445 --- /dev/null +++ b/helm-charts/mcord/mcord-data-plane/Chart.yaml @@ -0,0 +1,21 @@ +--- +# Copyright 2018-present Open Networking Foundation +# Copyright 2018 Intel Corporation +# +# 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. + +apiVersion: v1 +appVersion: "1.0" +description: A Helm chart for MCORD Data Plane Services +name: mcord-data-plane +version: 0.3.1 diff --git a/helm-charts/mcord/mcord-data-plane/templates/_helpers.tpl b/helm-charts/mcord/mcord-data-plane/templates/_helpers.tpl new file mode 100644 index 0000000..4a4907e --- /dev/null +++ b/helm-charts/mcord/mcord-data-plane/templates/_helpers.tpl @@ -0,0 +1,48 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation +Copyright 2018 Intel Corporation + +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. +*/}} +{{/* +Expand the name of the chart. +*/}} +{{- define "mcord-dp-helm.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "mcord-dp-helm.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "mcord-dp-helm.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} diff --git a/helm-charts/mcord/mcord-data-plane/templates/cm.yaml b/helm-charts/mcord/mcord-data-plane/templates/cm.yaml new file mode 100644 index 0000000..f2b7f7c --- /dev/null +++ b/helm-charts/mcord/mcord-data-plane/templates/cm.yaml @@ -0,0 +1,438 @@ +--- +# Copyright 2018-present Open Networking Foundation +# Copyright 2018 Intel Corporation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: ngicdp-config +data: + adc_rules.cfg: | + [GLOBAL] + NUM_ADC_RULES = 5 + + ;FORMAT :: + ;ADC_TYPE : [ DOMAIN = 0 | IP = 1 | IP PREFIX =2 ] + ; + ;if ADC_TYPE = 0 + ; DOMAIN + ;elseif ADC_TYPE = 1 + ; IP + ;elseif ADC_TYPE = 2 + ; IP + ; PREFIX + ;else + ; NONE + ; + ;NOTE : + ;Rules defined first have a higher priority, unless DROP is specified + ;(i.e. multiple rules for the same IP). + ;When specifying DROP with an IP address, use a prefix of 32 to prevent DNS + ;results from overwriting rule. + + + [ADC_RULE_1] + ADC_TYPE = 2 + IP = 0.0.0.0 + PREFIX = 0 + + [ADC_RULE_2] + ADC_TYPE = 2 + IP = 13.1.1.0 + PREFIX = 24 + + [ADC_RULE_3] + ADC_TYPE = 1 + IP = 13.1.1.254 + + [ADC_RULE_4] + ADC_TYPE = 0 + DOMAIN = www.example.gov + + [ADC_RULE_5] + ADC_TYPE = 0 + DOMAIN = www.drop_example.com + cdr.cfg: | + CDR_PATH=./cdr + MASTER_CDR=./cdr/master.csv + cp_config.cfg: | + if [ ! -d "/dev/hugepages" ]; then + MEMORY="--no-huge -m $((MEM_LIMIT-1024))" + fi + + SGW_S1U_IP=$(netstat -ie | grep -A1 s1u-net | tail -1 | awk '{print $2}' | tr -d addr:) + SHARED_DIR="/opt/ngic/config/shared" + if [ -d ${SHARED_DIR} ]; then + while [ ! -f ${SHARED_DIR}/SGW_S1U_IP ]; do echo "Waiting for SGW_S1U_IP"; sleep 2; done + SGW_S1U_IP=$(cat ${SHARED_DIR}/SGW_S1U_IP) + fi + + SGW_S11_IP=$(hostname) + MGMT_INFO="-s ${SGW_S11_IP} -m ${MME_S11_IP} -w ${SGW_S1U_IP}" + APN_INFO="-i ${IP_POOL_IP} -p ${IP_POOL_MASK} -a ${APN}" + SPGW_CFG="-d 03 -l 2 -r 7.7.7.7 -g 6.6.6.6 -v 4.4.4.4 -u 5.5.5.5" + + TEID_INFO="-t ${S11_TEID_POOL_START} -e ${S11_TEID_POOL_STOP} -q ${S1U_TEID_POOL_START} -o ${S1U_TEID_POOL_STOP}" + APP_ARGS="${MGMT_INFO} ${APN_INFO} ${SPGW_CFG} ${TEID_INFO}" + + CORES="-c $(taskset -p $$ | awk '{print $NF}')" + DEVICES="--no-pci" + EAL_ARGS="${CORES} ${MEMORY} ${DEVICES}" + dp_config.cfg: | + get_pcimac_addr () { + ifname=$1 + cid="$(sed -ne '/hostname/p' /proc/1/task/1/mountinfo | awk -F '/' '{print $6}' |tr -d " " )" + cid="$cid-$ifname" + eval "export $2=$(awk -F '"' '{print $4}' /sriov-cni/$cid)" + eval "export $3=$(awk -F '"' '{print $8}' /sriov-cni/$cid)" + eval "export $4=$(awk -F '"' '{print $12}' /sriov-cni/$cid)" + } + + if [ -d "/sriov-cni" ]; then + echo "================== SR-IOV FOUND ============" + get_pcimac_addr s1u-net SGW_S1U_PCI S1U_MAC SGW_S1U_IP + get_pcimac_addr sgi-net SGW_SGI_PCI SGI_MAC SGW_SGI_IP + DEVICES="-w $SGW_S1U_PCI -w $SGW_SGI_PCI" + SHARED_DIR="/opt/ngic/config/shared" + echo $SGW_S1U_IP > ${SHARED_DIR}/SGW_S1U_IP + else #dev --vdev af_packt + echo "vdev (AF_PACKET)" + # set the variables we provide + SGW_S1U_IP=$(netstat -ie | grep -A1 s1u-net | tail -1 | awk '{print $2}' | tr -d addr:) + SGW_SGI_IP=$(netstat -ie | grep -A1 sgi-net | tail -1 | awk '{print $2}' | tr -d addr:) + S1U_MAC=$( netstat -ie | grep -B1 $SGW_S1U_IP | head -n1 | awk '{print $5}' ) + SGI_MAC=$( netstat -ie | grep -B1 $SGW_SGI_IP | head -n1 | awk '{print $5}' ) + + DEVICES="--no-pci --vdev eth_af_packet0,iface=s1u-net --vdev eth_af_packet1,iface=sgi-net" + fi + + if [ ! -d "/dev/hugepages" ]; then + MEMORY="--no-huge -m $((MEM_LIMIT-1024))" + fi + + CORES="-c $(taskset -p $$ | awk '{print $NF}')" + SPGW_CFG="--spgw_cfg 03" + EAL_ARGS="${CORES} ${MEMORY} ${DEVICES}" + + S1U="--s1u_ip ${SGW_S1U_IP} --s1u_mac ${S1U_MAC}" + SGI="--sgi_ip ${SGW_SGI_IP} --sgi_mac ${SGI_MAC} --sgi_gw_ip ${RTR_SGI_IP} --sgi_mask ${SGI_MASK}" + WORKERS="--num_workers 1" + MISC="--log 1" + APP_ARGS="${S1U} ${SGI} ${WORKERS} ${MISC} ${SPGW_CFG}" + interface.cfg: | + [0] + dp_comm_ip = 127.0.0.1 + dp_comm_port = 20 + cp_comm_ip = {{ .Values.controlplane_hostname }} + cp_comm_port = {{ .Values.controlplane_port }} + meter_profile.cfg: | + [GLOBAL] + NUM_OF_IDX = 7 + + [ENTRY_1] + ;Committed Information Rate (CIR). Measured in bytes per second. + ;MBR is mapped into CIR, convert MBR from bits to Bytes and set CIR. + CIR = 2342400 + ;Committed Burst Size unit = Bytes + CBS = 5856 + ;Excess Burst Size unit = Bytes + EBS = 11712 + ;Meter profile index. Refer this index in static_pcc.cfg to set AMBR/MBR + MTR_PROFILE_IDX = 3 + + [ENTRY_2] + ;1200 = 1756800 + ;1400 = 2049600 + ;1600 = 2342400 + CIR = 2342400 + CBS = 5856 + EBS = 11712 + MTR_PROFILE_IDX = 4 + + [ENTRY_3] + ; QCI5,QCI7 15.571kbps = 1947 B + CIR = 2342400 + CBS = 5856 + EBS = 11712 + MTR_PROFILE_IDX = 5 + + [ENTRY_4] + ; QCI1, 44kbps = 5500 B + CIR = 2342400 + CBS = 5856 + EBS = 11712 + MTR_PROFILE_IDX = 6 + + [ENTRY_5] + ; QCI9, 31.143kbps = 3893 B + CIR = 2342400 + CBS = 5856 + EBS = 11712 + MTR_PROFILE_IDX = 7 + + [ENTRY_6] + ; 128B, 7pps + CIR = 2342400 + CBS = 512 + EBS = 1024 + MTR_PROFILE_IDX = 8 + + [ENTRY_7] + ; 128B, 2pps + CIR = 2342400 + CBS = 512 + EBS = 1024 + MTR_PROFILE_IDX = 9 + + pcc_rules.cfg: | + [GLOBAL] + NUM_PCC_FILTERS = 9 + ;To config AMBR/MBR values refer meter_profile.cfg. specify only the + ;meter profile index to be set here. + UL_AMBR_MTR_PROFILE_IDX = 3 + DL_AMBR_MTR_PROFILE_IDX = 4 + + ;default filter - must be first for now (until DP doesn't install any filters) + ;associated with default adc rule + [PCC_FILTER_1] + RULE_NAME = DefaultRule + RATING_GROUP = 9 + SERVICE_ID = 0 + RULE_STATUS = 0 + GATE_STATUS = 1 + SESSION_CONT = 0 + REPORT_LEVEL = 1 + CHARGING_MODE = 0 + METERING_METHOD = 0 + MUTE_NOTIFY = 0 + MONITORING_KEY = 0 + SPONSOR_ID = 0 + REDIRECT_INFO = 0 + PRECEDENCE = 254 + DROP_PKT_COUNT = 0 + ;Specify the meter profile index from meter_profile.cfg + UL_MBR_MTR_PROFILE_IDX = 7 + DL_MBR_MTR_PROFILE_IDX = 7 + ;List of ADC filter indices + SDF_FILTER_IDX = 99998 + + [PCC_FILTER_2] + RULE_NAME = sdf_rule_1 + RATING_GROUP = 5 + SERVICE_ID = 0 + RULE_STATUS = 0 + GATE_STATUS = 1 + SESSION_CONT = 0 + REPORT_LEVEL = 2 + CHARGING_MODE = 0 + METERING_METHOD = 0 + MUTE_NOTIFY = 0 + MONITORING_KEY = 0 + SPONSOR_ID = 0 + REDIRECT_INFO = 0 + PRECEDENCE = 1 + DROP_PKT_COUNT = 0 + UL_MBR_MTR_PROFILE_IDX = 5 + DL_MBR_MTR_PROFILE_IDX = 5 + ;List of SDF filter indices + SDF_FILTER_IDX = 1 + + [PCC_FILTER_3] + RULE_NAME = sdf_rule_2 + RATING_GROUP = 1 + SERVICE_ID = 0 + RULE_STATUS = 0 + GATE_STATUS = 1 + SESSION_CONT = 0 + REPORT_LEVEL = 3 + CHARGING_MODE = 0 + METERING_METHOD = 0 + MUTE_NOTIFY = 0 + MONITORING_KEY = 0 + SPONSOR_ID = 0 + REDIRECT_INFO = 0 + PRECEDENCE = 18 + DROP_PKT_COUNT = 0 + UL_MBR_MTR_PROFILE_IDX = 6 + DL_MBR_MTR_PROFILE_IDX = 6 + ;List of SDF filter indices + SDF_FILTER_IDX = 2 + + [PCC_FILTER_4] + RULE_NAME = adc_rule_1 + RATING_GROUP = Zero-Rate + SERVICE_ID = Internet + RULE_STATUS = 0 + GATE_STATUS = 1 + SESSION_CONT = 0 + REPORT_LEVEL = 8 + CHARGING_MODE = 0 + METERING_METHOD = 0 + MUTE_NOTIFY = 0 + MONITORING_KEY = 0 + REDIRECT_INFO = 0 + SPONSOR_ID = Example + PRECEDENCE = 15 + DROP_PKT_COUNT = 0 + UL_MBR_MTR_PROFILE_IDX = 7 + DL_MBR_MTR_PROFILE_IDX = 7 + ;List of SDF filter indices + ADC_FILTER_IDX = 1 + + [PCC_FILTER_5] + RULE_NAME = adc_rule_2 + RATING_GROUP = 0 + SERVICE_ID = CIPA + RULE_STATUS = 0 + GATE_STATUS = 1 + SESSION_CONT = 0 + REPORT_LEVEL = 9 + CHARGING_MODE = 0 + METERING_METHOD = 0 + MUTE_NOTIFY = 0 + MONITORING_KEY = 0 + SPONSOR_ID = Example + REDIRECT_INFO = 0 + SPONSOR_ID = Example + REDIRECT_INFO = 0 + PRECEDENCE = 4 + DROP_PKT_COUNT = 0 + UL_MBR_MTR_PROFILE_IDX = 0 + DL_MBR_MTR_PROFILE_IDX = 0 + ;List of SDF filter indices + ADC_FILTER_IDX = 2 + + [PCC_FILTER_6] + RULE_NAME = sdf_rule_3 + RATING_GROUP = 7 + SERVICE_ID = 0 + RULE_STATUS = 0 + GATE_STATUS = 1 + SESSION_CONT = 0 + REPORT_LEVEL = 4 + CHARGING_MODE = 0 + METERING_METHOD = 0 + MUTE_NOTIFY = 0 + MONITORING_KEY = 0 + SPONSOR_ID = 0 + REDIRECT_INFO = 0 + PRECEDENCE = 17 + DROP_PKT_COUNT = 0 + UL_MBR_MTR_PROFILE_IDX = 5 + DL_MBR_MTR_PROFILE_IDX = 5 + ;List of SDF filter indices + SDF_FILTER_IDX = 3 + + [PCC_FILTER_7] + RULE_NAME = adc_rule_3 + RATING_GROUP = Zero-Rate + SERVICE_ID = Internet + RULE_STATUS = 0 + GATE_STATUS = 1 + SESSION_CONT = 0 + REPORT_LEVEL = 5 + CHARGING_MODE = 0 + METERING_METHOD = 0 + MUTE_NOTIFY = 0 + MONITORING_KEY = 0 + SPONSOR_ID = Example + REDIRECT_INFO = 0 + PRECEDENCE = 210 + DROP_PKT_COUNT = 0 + UL_MBR_MTR_PROFILE_IDX = 7 + DL_MBR_MTR_PROFILE_IDX = 7 + ;List of SDF filter indices + ADC_FILTER_IDX = 4 + + [PCC_FILTER_8] + RULE_NAME = adc_rule_4 + RATING_GROUP = Zero-Rate + SERVICE_ID = Management + RULE_STATUS = 0 + GATE_STATUS = 1 + SESSION_CONT = 0 + REPORT_LEVEL = 6 + CHARGING_MODE = 0 + METERING_METHOD = 0 + MUTE_NOTIFY = 0 + MONITORING_KEY = 0 + SPONSOR_ID = Example + REDIRECT_INFO = 0 + PRECEDENCE = 200 + DROP_PKT_COUNT = 0 + UL_MBR_MTR_PROFILE_IDX = 7 + DL_MBR_MTR_PROFILE_IDX = 7 + ;List of SDF filter indices + ADC_FILTER_IDX = 12 + + [PCC_FILTER_9] + RULE_NAME = adc_rule_5 + RATING_GROUP = Zero-Rate + SERVICE_ID = Provisioning + RULE_STATUS = 0 + GATE_STATUS = 1 + SESSION_CONT = 0 + REPORT_LEVEL = 7 + CHARGING_MODE = 0 + METERING_METHOD = 0 + MUTE_NOTIFY = 0 + MONITORING_KEY = 0 + SPONSOR_ID = Example + REDIRECT_INFO = 0 + PRECEDENCE = 220 + DROP_PKT_COUNT = 0 + UL_MBR_MTR_PROFILE_IDX = 7 + DL_MBR_MTR_PROFILE_IDX = 7 + ;List of SDF filter indices + ADC_FILTER_IDX = 3 + sdf_rules.cfg: | + [GLOBAL] + NUM_SDF_FILTERS = 4 + + [SDF_FILTER_1] + DIRECTION = downlink_only + IPV4_REMOTE = 13.2.1.113 + IPV4_REMOTE_MASK = 255.255.255.0 + PROTOCOL = 17 + LOCAL_LOW_LIMIT_PORT = 0 + LOCAL_HIGH_LIMIT_PORT = 65535 + REMOTE_LOW_LIMIT_PORT = 0 + REMOTE_HIGH_LIMIT_PORT = 65535 + + [SDF_FILTER_2] + DIRECTION = uplink_only + IPV4_LOCAL = 16.255.255.0 + IPV4_LOCAL_MASK = 255.255.255.0 + PROTOCOL = 17 + LOCAL_LOW_LIMIT_PORT = 0 + LOCAL_HIGH_LIMIT_PORT = 65535 + REMOTE_LOW_LIMIT_PORT = 0 + REMOTE_HIGH_LIMIT_PORT = 65535 + + [SDF_FILTER_3] + DIRECTION = downlink_only + IPV4_REMOTE = 130.10.0.0 + IPV4_REMOTE_MASK = 255.255.0.0 + PROTOCOL = 17 + REMOTE_LOW_LIMIT_PORT = 5060 + REMOTE_HIGH_LIMIT_PORT = 5060 + + [SDF_FILTER_4] + DIRECTION = uplink_only + IPV4_REMOTE = 103.1.0.0 + IPV4_REMOTE_MASK = 255.255.0.0 + PROTOCOL = 17 + LOCAL_LOW_LIMIT_PORT = 17000 + LOCAL_HIGH_LIMIT_PORT = 17010 diff --git a/helm-charts/mcord/mcord-data-plane/templates/dp.yaml b/helm-charts/mcord/mcord-data-plane/templates/dp.yaml new file mode 100644 index 0000000..4038394 --- /dev/null +++ b/helm-charts/mcord/mcord-data-plane/templates/dp.yaml @@ -0,0 +1,155 @@ +--- +# Copyright 2018-present Open Networking Foundation +# Copyright 2018 Intel Corporation +# +# 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. + +--- +apiVersion: v1 +kind: Service +metadata: + name: ngic-dp +spec: + selector: + app: ngic-dp + clusterIP: None + ports: + - name: sx + port: {{ .Values.ngic_dp.ports.sx }} + protocol: UDP +--- +apiVersion: v1 +kind: Service +metadata: + name: ngic-dp-external +spec: + selector: + app: ngic-dp + type: NodePort + ports: + - port: {{ .Values.ngic_dp.ports.sx }} + nodePort: {{ .Values.ngic_dp.ports.sx_external }} + protocol: UDP +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: ngic-dp + labels: + app: ngic-dp +spec: + replicas: {{ .Values.ngic_dp.replicas }} + + selector: + matchLabels: + app: ngic-dp + serviceName: "ngic-dp" + template: + metadata: + labels: + app: ngic-dp + annotations: + k8s.v1.cni.cncf.io/networks: '[ + { "name": "s1u-net", "interface": "s1u-net", "namespace": "default" }, + { "name": "sgi-net", "interface": "sgi-net", "namespace": "default" } + ]' + spec: + nodeSelector: + kubernetes.io/hostname: "node3" + initContainers: + - name: init-iptables + image: {{ .Values.ngic_dp.images.init }} + command: [ "sh", "-c"] + securityContext: + capabilities: + add: + - NET_ADMIN + args: + - iptables -I OUTPUT -p icmp --icmp-type destination-unreachable -j DROP; + terminationGracePeriodSeconds: 1 + containers: + - name: ngic + image: {{ .Values.ngic_dp.images.dp }} + imagePullPolicy: IfNotPresent + stdin: true + tty: true + env: + - name: RTR_SGI_IP + value: {{ .Values.ngic_dp.config.rtr_sgi_ip }} + - name: SGI_MASK + value: {{ .Values.ngic_dp.config.sgi_mask }} + - name: MEM_LIMIT + valueFrom: + resourceFieldRef: + containerName: ngic + resource: limits.memory + divisor: 1Mi + command: [ "bash", "-xc"] + args: + - ip addr show; + ifconfig; + . /opt/ngic/config/dp_config.cfg; + ./ngic_dataplane $EAL_ARGS -- $APP_ARGS + volumeMounts: + - name: config-volume + mountPath: /opt/ngic/config + {{- if .Values.ngic_dp.config.hugepage_enabled}} + - name: hugepage + mountPath: /dev/hugepages + {{- end}} + - name: shared-data + mountPath: /opt/ngic/config/shared + {{- if .Values.ngic_dp.config.dpdk_enabled}} + - name: sriov-volume + mountPath: /sriov-cni + - name: vfio-volume + mountPath: /dev/vfio + {{- end}} + resources: + limits: + {{- if .Values.ngic_dp.config.hugepage_enabled}} + hugepages-1Gi: {{ .Values.ngic_dp.resources.hugepage }} + {{- end}} + cpu: {{ .Values.ngic_dp.resources.cpu }} + memory: {{ .Values.ngic_dp.resources.mem }} + intel.com/sriov: '2' + securityContext: + {{- if .Values.ngic_dp.config.dpdk_enabled}} + privileged: true + {{- else}} + capabilities: + add: + - NET_ADMIN + - IPC_LOCK + {{- end}} + volumes: + - name: config-volume + configMap: + name: ngicdp-config + {{- if .Values.ngic_dp.config.hugepage_enabled}} + - name: hugepage + emptyDir: + medium: HugePages + {{- end}} + - name: shared-data + emptyDir: {} + {{- if .Values.ngic_dp.config.dpdk_enabled}} + - name: sriov-volume + hostPath: + path: /var/lib/cni/sriov + type: Directory + - name: vfio-volume + hostPath: + path: /dev/vfio + type: Directory + {{- end}} diff --git a/helm-charts/mcord/mcord-data-plane/values.yaml b/helm-charts/mcord/mcord-data-plane/values.yaml new file mode 100644 index 0000000..9403f17 --- /dev/null +++ b/helm-charts/mcord/mcord-data-plane/values.yaml @@ -0,0 +1,46 @@ +--- +# Copyright 2018-present Open Networking Foundation +# Copyright 2018 Intel Corporation +# +# 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. + +# Default values for mcord-vepc-helm. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +redis_hostname: "redis" +accelleran_hostname: "accelleran" +mme_hostname: "mme" +# CP is on REMOTE node2 +controlplane_hostname: "10.90.0.152" +controlplane_port: 31311 + +ngic_dp: + images: + init: "node1:30500/ngick8stesting/c3po-mmeinit" + dp: "node1:30500/ngick8stesting/ngic-dp:690f418" + ports: + sx: 20 + sx_external: 31310 + replicas: 1 + resources: + cpu: 8 + mem: "8Gi" + hugepage: "8Gi" + config: + rtr_sgi_ip: "13.1.1.254" + sgi_mask: "255.255.255.0" + dpdk_enabled: false + hugepage_enabled: false + +namespace: epc diff --git a/helm-charts/mininet/.helmignore b/helm-charts/mininet/.helmignore new file mode 100644 index 0000000..f0c1319 --- /dev/null +++ b/helm-charts/mininet/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/helm-charts/mininet/Chart.yaml b/helm-charts/mininet/Chart.yaml new file mode 100644 index 0000000..39568c7 --- /dev/null +++ b/helm-charts/mininet/Chart.yaml @@ -0,0 +1,20 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +appVersion: "1.0" +description: A Helm chart for Mininet +name: mininet +version: 0.3.0 diff --git a/helm-charts/mininet/templates/_helpers.tpl b/helm-charts/mininet/templates/_helpers.tpl new file mode 100644 index 0000000..31212af --- /dev/null +++ b/helm-charts/mininet/templates/_helpers.tpl @@ -0,0 +1,48 @@ +{{- /* + Copyright 2017-present Open Networking Foundation + + 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. + */ -}} + +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "mininet.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "mininet.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "mininet.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} diff --git a/helm-charts/mininet/templates/configmap.yaml b/helm-charts/mininet/templates/configmap.yaml new file mode 100644 index 0000000..7a2c1b6 --- /dev/null +++ b/helm-charts/mininet/templates/configmap.yaml @@ -0,0 +1,21 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ .Release.Name }}-configmap +data: +{{ (tpl (.Files.Glob "toposcripts/*").AsConfig .) | indent 2 }} diff --git a/helm-charts/mininet/templates/deployment.yaml b/helm-charts/mininet/templates/deployment.yaml new file mode 100644 index 0000000..f75041e --- /dev/null +++ b/helm-charts/mininet/templates/deployment.yaml @@ -0,0 +1,71 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: apps/v1beta2 +kind: Deployment +metadata: + name: {{ template "mininet.fullname" . }} + labels: + app: {{ template "mininet.name" . }} + chart: {{ template "mininet.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + app: {{ template "mininet.name" . }} + release: {{ .Release.Name }} + template: + metadata: + labels: + app: {{ template "mininet.name" . }} + release: {{ .Release.Name }} + {{- with .Values.annotations }} + annotations: +{{ toYaml . | indent 8 }} + {{- end }} + spec: + containers: + - name: {{ .Chart.Name }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + args: ["/toposcripts/topo.py"] + stdin: true + tty: true + securityContext: + privileged: true + volumeMounts: + - name: "topo-config" + mountPath: "/toposcripts" + resources: +{{ toYaml .Values.resources | indent 12 }} + volumes: + - name: "topo-config" + configMap: + name: "{{ .Release.Name }}-configmap" + defaultMode: 0755 + {{- with .Values.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} diff --git a/helm-charts/mininet/toposcripts/topo.py b/helm-charts/mininet/toposcripts/topo.py new file mode 100644 index 0000000..0c9c7cf --- /dev/null +++ b/helm-charts/mininet/toposcripts/topo.py @@ -0,0 +1,64 @@ +#!/usr/bin/python + +# Copyright 2017-present Open Networking Foundation +# +# 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 re +import sys +import socket + +from mininet.cli import CLI +from mininet.log import setLogLevel, info, error +from mininet.net import Mininet +from mininet.link import Intf +from mininet.topo import SingleSwitchTopo +from mininet.node import OVSSwitch, RemoteController +from functools import partial +from mininet.util import quietRun + +if __name__ == '__main__': + setLogLevel( 'info' ) + + info( '*** Installing required software' ) + print quietRun( 'apt-get update' ) + print quietRun( 'apt-get -y install dnsmasq ethtool' ) + + info( '*** Creating network\n' ) + print quietRun( 'ovs-vsctl set Open_vSwitch . other_config:vlan-limit={{ .Values.vlanMatchDepth }}' ) + OVSSwitch13 = partial( OVSSwitch, protocols='OpenFlow13' ) + controllerIp = socket.gethostbyname( '{{ .Values.onosOpenflowSvc }}' ) + net = Mininet( topo=SingleSwitchTopo(1), + controller=lambda name: RemoteController( name, ip=controllerIp, port=6653 ), + switch=OVSSwitch13 + ) + + switch = net.switches[ 0 ] + info( '*** Adding hardware interface eth1 to switch', switch.name, '\n' ) + _intf = Intf( 'eth1', node=switch ) + + info( '*** Turning off checksum offloading for eth1\n' ) + print quietRun( 'ethtool -K eth1 tx off rx off' ) + + bgphost = net.hosts [ 0 ] + info( '*** Adding VLAN interface to host\n') + bgphost.cmd( 'ip link add link h1-eth0 name h1-eth0.222 type vlan proto 802.1Q id 222' ) + bgphost.cmd( 'ip link add link h1-eth0.222 name h1-eth0.222.111 type vlan proto 802.1Q id 111' ) + bgphost.cmd( 'ifconfig h1-eth0.222 up' ) + bgphost.cmd( 'ifconfig h1-eth0.222.111 up' ) + bgphost.cmd( 'ifconfig h1-eth0.222.111 172.18.0.10/24' ) + bgphost.cmd( 'dnsmasq --dhcp-range=172.18.0.50,172.18.0.150,12h' ) + + net.start() + CLI( net ) + net.stop() diff --git a/helm-charts/mininet/values.yaml b/helm-charts/mininet/values.yaml new file mode 100644 index 0000000..3670bef --- /dev/null +++ b/helm-charts/mininet/values.yaml @@ -0,0 +1,52 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +# Put Mininet topology scripts in the toposcripts directory. +# They will be mounted inside the container in /toposcripts + +replicaCount: 1 + +nameOverride: "" +fullnameOverride: "" + +image: + repository: ciena/mininet + tag: ubuntu-bionic + pullPolicy: IfNotPresent + +resources: {} + +nodeSelector: {} + +tolerations: [] + +affinity: + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - weight: 100 + podAffinityTerm: + labelSelector: + matchExpressions: + - key: app + operator: In + values: + - olt + topologyKey: kubernetes.io/hostname + +annotations: + cni: "calico,pon1" + +onosOpenflowSvc: "onos-openflow.default.svc.cluster.local" +vlanMatchDepth: 2 diff --git a/helm-charts/nem-monitoring/.helmignore b/helm-charts/nem-monitoring/.helmignore new file mode 100644 index 0000000..f0c1319 --- /dev/null +++ b/helm-charts/nem-monitoring/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/helm-charts/nem-monitoring/Chart.yaml b/helm-charts/nem-monitoring/Chart.yaml new file mode 100644 index 0000000..a47b15f --- /dev/null +++ b/helm-charts/nem-monitoring/Chart.yaml @@ -0,0 +1,18 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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: nem-monitoring +description: Time Series Storage and Dashboard for SEBA +version: 1.0.1 diff --git a/helm-charts/nem-monitoring/README.md b/helm-charts/nem-monitoring/README.md new file mode 100644 index 0000000..d15253b --- /dev/null +++ b/helm-charts/nem-monitoring/README.md @@ -0,0 +1,20 @@ +# Nem Monitoring + +To deploy this chart please use: + +```shell +helm install -n nem-monitoring nem-monitoring/ +``` + +It will expose: + +- grafana on port `31300` +- prometheus on port `31301` + +## Running on minikube + +On minikube you don't need all the permission schema, so install this chart with: + +```shell +helm install -n nem-monitoring nem-monitoring/ -f nem-monitoring/examples/nem-monitoring-minikube.yaml +``` \ No newline at end of file diff --git a/helm-charts/nem-monitoring/examples/nem-monitoring-minikube.yaml b/helm-charts/nem-monitoring/examples/nem-monitoring-minikube.yaml new file mode 100644 index 0000000..a8aa763 --- /dev/null +++ b/helm-charts/nem-monitoring/examples/nem-monitoring-minikube.yaml @@ -0,0 +1,23 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +prometheus: + rbac: + create: false +grafana: + rbac: + create: false + serviceAccount: + create: false \ No newline at end of file diff --git a/helm-charts/nem-monitoring/grafana-dashboards/kb8s-app-metrics.json b/helm-charts/nem-monitoring/grafana-dashboards/kb8s-app-metrics.json new file mode 100644 index 0000000..9b5d28f --- /dev/null +++ b/helm-charts/nem-monitoring/grafana-dashboards/kb8s-app-metrics.json @@ -0,0 +1,1400 @@ +{ + "__inputs": [ + { + "name": "DS_PROMETHEUS", + "label": "prometheus", + "description": "", + "type": "datasource", + "pluginId": "prometheus", + "pluginName": "Prometheus" + } + ], + "__requires": [ + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "4.1.1" + }, + { + "type": "panel", + "id": "graph", + "name": "Graph", + "version": "" + }, + { + "type": "datasource", + "id": "prometheus", + "name": "Prometheus", + "version": "1.0.0" + } + ], + "annotations": { + "list": [] + }, + "editable": true, + "gnetId": 1471, + "graphTooltip": 1, + "hideControls": false, + "id": null, + "links": [], + "refresh": "30s", + "rows": [ + { + "collapse": false, + "height": "250px", + "panels": [ + { + "aliasColors": {}, + "bars": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": {}, + "id": 3, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "sort": "avg", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "span": 6, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(irate(http_requests_total{app=\"$container\", handler!=\"prometheus\", kubernetes_namespace=\"$namespace\"}[30s])) by (kubernetes_namespace,app,code)", + "interval": "", + "intervalFactor": 1, + "legendFormat": "native | {{code}}", + "refId": "A", + "step": 10 + }, + { + "expr": "sum(irate(nginx_http_requests_total{app=\"$container\", kubernetes_namespace=\"$namespace\"}[30s])) by (kubernetes_namespace,app,status)", + "interval": "", + "intervalFactor": 1, + "legendFormat": "nginx | {{status}}", + "refId": "B", + "step": 10 + }, + { + "expr": "sum(irate(haproxy_backend_http_responses_total{app=\"$container\", kubernetes_namespace=\"$namespace\"}[30s])) by (app,kubernetes_namespace,code)", + "interval": "", + "intervalFactor": 1, + "legendFormat": "haproxy | {{code}}", + "refId": "C", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Request rate", + "tooltip": { + "msResolution": true, + "shared": false, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "ops", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "datasource": "Prometheus", + "fill": 1, + "id": 15, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "sort": "avg", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "span": 6, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(irate(haproxy_backend_http_responses_total{app=\"$container\", kubernetes_namespace=\"$namespace\",code=\"5xx\"}[30s])) by (app,kubernetes_namespace) / sum(irate(haproxy_backend_http_responses_total{app=\"$container\", kubernetes_namespace=\"$namespace\"}[30s])) by (app,kubernetes_namespace)", + "interval": "", + "intervalFactor": 2, + "legendFormat": "haproxy", + "refId": "A", + "step": 20 + }, + { + "expr": "sum(irate(http_requests_total{app=\"$container\", handler!=\"prometheus\", kubernetes_namespace=\"$namespace\", code=~\"5[0-9]+\"}[30s])) by (kubernetes_namespace,app) / sum(irate(http_requests_total{app=\"$container\", handler!=\"prometheus\", kubernetes_namespace=\"$namespace\"}[30s])) by (kubernetes_namespace,app)", + "intervalFactor": 2, + "legendFormat": "native", + "refId": "B", + "step": 20 + }, + { + "expr": "sum(irate(nginx_http_requests_total{app=\"$container\", kubernetes_namespace=\"$namespace\", status=~\"5[0-9]+\"}[30s])) by (kubernetes_namespace,app) / sum(irate(nginx_http_requests_total{app=\"$container\", kubernetes_namespace=\"$namespace\"}[30s])) by (kubernetes_namespace,app)", + "intervalFactor": 2, + "legendFormat": "nginx", + "refId": "C", + "step": 20 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Error rate", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "percentunit", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + } + ], + "repeat": null, + "repeatIteration": null, + "repeatRowId": null, + "showTitle": false, + "title": "Request rate", + "titleSize": "h6" + }, + { + "collapse": true, + "height": 224, + "panels": [ + { + "aliasColors": {}, + "bars": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": {}, + "id": 5, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "sort": "max", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "span": 12, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket{app=\"$container\", kubernetes_namespace=\"$namespace\"}[30s])) by (app,kubernetes_namespace,le))", + "intervalFactor": 1, + "legendFormat": "native | 0.99", + "refId": "A", + "step": 1 + }, + { + "expr": "histogram_quantile(0.90, sum(rate(http_request_duration_seconds_bucket{app=\"$container\", kubernetes_namespace=\"$namespace\"}[30s])) by (app,kubernetes_namespace,le))", + "intervalFactor": 1, + "legendFormat": "native | 0.90", + "refId": "B", + "step": 1 + }, + { + "expr": "histogram_quantile(0.5, sum(rate(http_request_duration_seconds_bucket{app=\"$container\", kubernetes_namespace=\"$namespace\"}[30s])) by (app,kubernetes_namespace,le))", + "interval": "", + "intervalFactor": 1, + "legendFormat": "native | 0.50", + "refId": "C", + "step": 1 + }, + { + "expr": "histogram_quantile(0.99, sum(rate(nginx_http_request_duration_seconds_bucket{app=\"$container\", kubernetes_namespace=\"$namespace\"}[30s])) by (app,kubernetes_namespace,le))", + "intervalFactor": 1, + "legendFormat": "nginx | 0.99", + "refId": "D", + "step": 1 + }, + { + "expr": "histogram_quantile(0.9, sum(rate(nginx_http_request_duration_seconds_bucket{app=\"$container\", kubernetes_namespace=\"$namespace\"}[30s])) by (app,kubernetes_namespace,le))", + "intervalFactor": 1, + "legendFormat": "nginx | 0.90", + "refId": "E", + "step": 1 + }, + { + "expr": "histogram_quantile(0.5, sum(rate(nginx_http_request_duration_seconds_bucket{app=\"$container\", kubernetes_namespace=\"$namespace\"}[30s])) by (app,kubernetes_namespace,le))", + "intervalFactor": 1, + "legendFormat": "nginx | 0.50", + "refId": "F", + "step": 1 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Response time percentiles", + "tooltip": { + "msResolution": true, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + } + ], + "repeat": null, + "repeatIteration": null, + "repeatRowId": null, + "showTitle": false, + "title": "Response time", + "titleSize": "h6" + }, + { + "collapse": false, + "height": 250, + "panels": [ + { + "aliasColors": {}, + "bars": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "id": 7, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "sort": "avg", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "span": 12, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "count(count(container_memory_usage_bytes{container_name=\"$container\", namespace=\"$namespace\"}) by (pod_name))", + "interval": "", + "intervalFactor": 1, + "legendFormat": "pods", + "refId": "A", + "step": 5 + }, + { + "expr": "count(count(container_memory_usage_bytes{container_name=\"$container\", namespace=\"$namespace\"}) by (kubernetes_io_hostname))", + "interval": "", + "intervalFactor": 2, + "legendFormat": "hosts", + "refId": "B", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Number of pods", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + } + ], + "repeat": null, + "repeatIteration": null, + "repeatRowId": null, + "showTitle": false, + "title": "Pod count", + "titleSize": "h6" + }, + { + "collapse": false, + "height": 250, + "panels": [ + { + "aliasColors": {}, + "bars": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "id": 12, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "sort": "avg", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "elasticsearch-logging-data-20170207a (logging) - system", + "color": "#BF1B00" + }, + { + "alias": "elasticsearch-logging-data-20170207a (logging) - user", + "color": "#508642" + } + ], + "span": 12, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum(irate(container_cpu_system_seconds_total{container_name=\"$container\", namespace=\"$namespace\"}[30s])) by (namespace,container_name) / sum(container_spec_cpu_shares{container_name=\"$container\", namespace=\"$namespace\"} / 1024) by (namespace,container_name)", + "intervalFactor": 2, + "legendFormat": "system", + "refId": "C", + "step": 10 + }, + { + "expr": "sum(irate(container_cpu_user_seconds_total{container_name=\"$container\", namespace=\"$namespace\"}[30s])) by (namespace,container_name) / sum(container_spec_cpu_shares{container_name=\"$container\", namespace=\"$namespace\"} / 1024) by (namespace,container_name)", + "interval": "", + "intervalFactor": 2, + "legendFormat": "user", + "refId": "B", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Cpu usage (relative to request)", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "percentunit", + "label": "", + "logBase": 1, + "max": "1", + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + } + ], + "repeat": null, + "repeatIteration": null, + "repeatRowId": null, + "showTitle": false, + "title": "Usage relative to request", + "titleSize": "h6" + }, + { + "collapse": true, + "height": 250, + "panels": [ + { + "aliasColors": {}, + "bars": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "id": 10, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "sort": "avg", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "span": 6, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(irate(container_cpu_usage_seconds_total{container_name=\"$container\", namespace=\"$namespace\"}[30s])) by (namespace,container_name) / sum(container_spec_cpu_quota{container_name=\"$container\", namespace=\"$namespace\"} / container_spec_cpu_period{container_name=\"$container\", namespace=\"$namespace\"}) by (namespace,container_name)", + "interval": "", + "intervalFactor": 1, + "legendFormat": "actual", + "metric": "", + "refId": "A", + "step": 1 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Cpu usage (relative to limit)", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "percentunit", + "label": "", + "logBase": 1, + "max": "1", + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "id": 11, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "sort": "avg", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "span": 6, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(container_memory_usage_bytes{container_name=\"$container\", namespace=\"$namespace\"}) by (namespace,container_name) / sum(container_spec_memory_limit_bytes{container_name=\"$container\", namespace=\"$namespace\"}) by (namespace,container_name)", + "interval": "", + "intervalFactor": 1, + "legendFormat": "actual", + "refId": "A", + "step": 1 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory usage (relative to limit)", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "percentunit", + "label": null, + "logBase": 1, + "max": "1", + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + } + ], + "repeat": null, + "repeatIteration": null, + "repeatRowId": null, + "showTitle": false, + "title": "Usage relative to limit", + "titleSize": "h6" + }, + { + "collapse": true, + "height": 250, + "panels": [ + { + "aliasColors": {}, + "bars": false, + "datasource": "Prometheus", + "fill": 1, + "id": 13, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "sort": "avg", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "span": 6, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(irate(container_cpu_usage_seconds_total{container_name=\"$container\", namespace=\"$namespace\"}[30s])) by (id,pod_name)", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{pod_name}}", + "refId": "A", + "step": 2 + }, + { + "expr": "sum(container_spec_cpu_quota{container_name=\"$container\", namespace=\"$namespace\"} / container_spec_cpu_period{container_name=\"$container\", namespace=\"$namespace\"}) by (namespace,container_name) / count(container_memory_usage_bytes{container_name=\"$container\", namespace=\"$namespace\"}) by (namespace,container_name) ", + "intervalFactor": 2, + "legendFormat": "limit", + "refId": "B", + "step": 2 + }, + { + "expr": "sum(container_spec_cpu_shares{container_name=\"$container\", namespace=\"$namespace\"} / 1024) by (namespace,container_name) / count(container_spec_cpu_shares{container_name=\"$container\", namespace=\"$namespace\"}) by (namespace,container_name) ", + "intervalFactor": 2, + "legendFormat": "request", + "refId": "C", + "step": 2 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Cpu usage (per pod)", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "cores", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "datasource": "Prometheus", + "fill": 1, + "id": 14, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "sort": "avg", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "span": 6, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(container_memory_usage_bytes{container_name=\"$container\", namespace=\"$namespace\"}) by (id,pod_name)", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{pod_name}}", + "refId": "A", + "step": 2 + }, + { + "expr": "sum(container_spec_memory_limit_bytes{container_name=\"$container\", namespace=\"$namespace\"}) by (namespace,container_name) / count(container_memory_usage_bytes{container_name=\"$container\", namespace=\"$namespace\"}) by (container_name,namespace)", + "intervalFactor": 2, + "legendFormat": "limit", + "refId": "B", + "step": 2 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory usage (per pod)", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + } + ], + "repeat": null, + "repeatIteration": null, + "repeatRowId": null, + "showTitle": false, + "title": "Usage per pod", + "titleSize": "h6" + }, + { + "collapse": true, + "height": 250, + "panels": [ + { + "aliasColors": {}, + "bars": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "id": 8, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "sort": "avg", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "span": 6, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(irate(container_cpu_usage_seconds_total{container_name=\"$container\", namespace=\"$namespace\"}[30s])) by (namespace,container_name) / count(container_memory_usage_bytes{container_name=\"$container\", namespace=\"$namespace\"}) by (namespace,container_name) ", + "interval": "", + "intervalFactor": 1, + "legendFormat": "actual", + "refId": "A", + "step": 1 + }, + { + "expr": "sum(container_spec_cpu_quota{container_name=\"$container\", namespace=\"$namespace\"} / container_spec_cpu_period{container_name=\"$container\", namespace=\"$namespace\"}) by (namespace,container_name) / count(container_memory_usage_bytes{container_name=\"$container\", namespace=\"$namespace\"}) by (namespace,container_name) ", + "interval": "", + "intervalFactor": 1, + "legendFormat": "limit", + "refId": "B", + "step": 1 + }, + { + "expr": "sum(container_spec_cpu_shares{container_name=\"$container\", namespace=\"$namespace\"} / 1024) by (namespace,container_name) / count(container_spec_cpu_shares{container_name=\"$container\", namespace=\"$namespace\"}) by (namespace,container_name) ", + "interval": "", + "intervalFactor": 1, + "legendFormat": "request", + "refId": "C", + "step": 1 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Cpu usage (avg per pod)", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "label": "cores", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "id": 9, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "sort": "avg", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "span": 6, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(container_memory_usage_bytes{container_name=\"$container\", namespace=\"$namespace\"}) by (namespace,container_name) / count(container_memory_usage_bytes{container_name=\"$container\", namespace=\"$namespace\"}) by (namespace,container_name) ", + "intervalFactor": 1, + "legendFormat": "actual", + "metric": "", + "refId": "A", + "step": 1 + }, + { + "expr": "sum(container_spec_memory_limit_bytes{container_name=\"$container\", namespace=\"$namespace\"}) by (namespace,container_name) / count(container_memory_usage_bytes{container_name=\"$container\", namespace=\"$namespace\"}) by (namespace,container_name) ", + "interval": "", + "intervalFactor": 1, + "legendFormat": "limit", + "refId": "B", + "step": 1 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory usage (avg per pod)", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + } + ], + "repeat": null, + "repeatIteration": null, + "repeatRowId": null, + "showTitle": false, + "title": "Usage per pod (average)", + "titleSize": "h6" + }, + { + "collapse": true, + "height": 259.4375, + "panels": [ + { + "aliasColors": {}, + "bars": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": {}, + "id": 1, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "sort": "avg", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "span": 6, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(irate(container_cpu_usage_seconds_total{container_name=\"$container\", namespace=\"$namespace\"}[30s])) by (namespace,container_name)", + "hide": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "actual", + "metric": "", + "refId": "A", + "step": 1 + }, + { + "expr": "sum(container_spec_cpu_quota{container_name=\"$container\", namespace=\"$namespace\"} / container_spec_cpu_period{container_name=\"$container\", namespace=\"$namespace\"}) by (namespace,container_name)", + "intervalFactor": 1, + "legendFormat": "limit", + "refId": "B", + "step": 1 + }, + { + "expr": "sum(container_spec_cpu_shares{container_name=\"$container\", namespace=\"$namespace\"} / 1024) by (namespace,container_name) ", + "intervalFactor": 1, + "legendFormat": "request", + "refId": "C", + "step": 1 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Cpu usage (total)", + "tooltip": { + "msResolution": true, + "shared": false, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "label": "cores", + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": {}, + "id": 2, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "sort": "avg", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "span": 6, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(container_memory_usage_bytes{container_name=\"$container\", namespace=\"$namespace\"}) by (namespace,container_name)", + "interval": "", + "intervalFactor": 1, + "legendFormat": "actual", + "refId": "A", + "step": 1 + }, + { + "expr": "sum(container_spec_memory_limit_bytes{container_name=\"$container\", namespace=\"$namespace\"}) by (namespace,container_name)", + "intervalFactor": 1, + "legendFormat": "limit", + "refId": "B", + "step": 1 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory usage (total)", + "tooltip": { + "msResolution": true, + "shared": false, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + } + ], + "repeat": null, + "repeatIteration": null, + "repeatRowId": null, + "showTitle": false, + "title": "Usage total", + "titleSize": "h6" + } + ], + "schemaVersion": 14, + "style": "dark", + "tags": [], + "templating": { + "list": [ + { + "allValue": ".+", + "current": {}, + "datasource": "Prometheus", + "hide": 0, + "includeAll": false, + "label": null, + "multi": false, + "name": "namespace", + "options": [], + "query": "label_values(container_memory_usage_bytes{namespace=~\".+\",container_name!=\"POD\"},namespace)", + "refresh": 1, + "regex": "", + "sort": 1, + "tagValuesQuery": null, + "tags": [], + "tagsQuery": null, + "type": "query", + "useTags": false + }, + { + "allValue": ".+", + "current": {}, + "datasource": "Prometheus", + "hide": 0, + "includeAll": false, + "label": null, + "multi": false, + "name": "container", + "options": [], + "query": "label_values(container_memory_usage_bytes{namespace=~\"$namespace\",container_name!=\"POD\"},container_name)", + "refresh": 1, + "regex": "", + "sort": 1, + "tagValuesQuery": null, + "tags": [], + "tagsQuery": null, + "type": "query", + "useTags": false + } + ] + }, + "time": { + "from": "now-3h", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "timezone": "browser", + "title": "Kubernetes App Metrics", + "version": 37, + "description": "After selecting your namespace and container you get a wealth of metrics like request rate, error rate, response times, pod count, cpu and memory usage. You can view cpu and memory usage in a variety of ways, compared to the limit, compared to the request, per pod, average per pod, etc." + } \ No newline at end of file diff --git a/helm-charts/nem-monitoring/grafana-dashboards/node-exporter.json b/helm-charts/nem-monitoring/grafana-dashboards/node-exporter.json new file mode 100644 index 0000000..1406430 --- /dev/null +++ b/helm-charts/nem-monitoring/grafana-dashboards/node-exporter.json @@ -0,0 +1,20937 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "gnetId": 1860, + "graphTooltip": 0, + "id": null, + "iteration": 1550176331904, + "links": [], + "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 261, + "panels": [], + "repeat": null, + "title": "Basic CPU / Mem / Disk Gauge", + "type": "row" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": true, + "colors": [ + "rgba(50, 172, 45, 0.97)", + "rgba(237, 129, 40, 0.89)", + "rgba(245, 54, 54, 0.9)" + ], + "datasource": "Prometheus", + "decimals": null, + "description": "Busy state of all CPU cores together", + "format": "percent", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": true, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 0, + "y": 1 + }, + "id": 20, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "minSpan": 2, + "nullPointMode": "null", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": true + }, + "tableColumn": "", + "targets": [ + { + "expr": "(((count(count(node_cpu_seconds_total{instance=~\"$node:$port\",job=~\"$job\"}) by (cpu))) - avg(sum by (mode)(irate(node_cpu_seconds_total{mode='idle',instance=~\"$node:$port\",job=~\"$job\"}[5m])))) * 100) / count(count(node_cpu_seconds_total{instance=~\"$node:$port\",job=~\"$job\"}) by (cpu))", + "hide": false, + "intervalFactor": 1, + "legendFormat": "", + "refId": "A", + "step": 900 + } + ], + "thresholds": "85,95", + "title": "CPU Busy", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": true, + "colors": [ + "rgba(50, 172, 45, 0.97)", + "rgba(237, 129, 40, 0.89)", + "rgba(245, 54, 54, 0.9)" + ], + "datasource": "Prometheus", + "decimals": 0, + "description": "Non available RAM memory", + "format": "percent", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": true, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 4, + "y": 1 + }, + "hideTimeOverride": false, + "id": 16, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "minSpan": 4, + "nullPointMode": "null", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": true + }, + "tableColumn": "", + "targets": [ + { + "expr": "((node_memory_MemTotal_bytes{instance=~\"$node:$port\",job=~\"$job\"} - node_memory_MemFree_bytes{instance=~\"$node:$port\",job=~\"$job\"}) / (node_memory_MemTotal_bytes{instance=~\"$node:$port\",job=~\"$job\"} )) * 100", + "format": "time_series", + "hide": true, + "intervalFactor": 1, + "refId": "A", + "step": 900 + }, + { + "expr": "100 - ((node_memory_MemAvailable_bytes{instance=~\"$node:$port\",job=~\"$job\"} * 100) / node_memory_MemTotal_bytes{instance=~\"$node:$port\",job=~\"$job\"})", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "refId": "B", + "step": 900 + } + ], + "thresholds": "80,90", + "title": "Used RAM Memory", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": true, + "colors": [ + "rgba(50, 172, 45, 0.97)", + "rgba(237, 129, 40, 0.89)", + "rgba(245, 54, 54, 0.9)" + ], + "datasource": "Prometheus", + "decimals": null, + "description": "Used Swap", + "format": "percent", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": true, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 8, + "y": 1 + }, + "id": 21, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "minSpan": 4, + "nullPointMode": "null", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": true + }, + "tableColumn": "", + "targets": [ + { + "expr": "((node_memory_SwapTotal_bytes{instance=~\"$node:$port\",job=~\"$job\"} - node_memory_SwapFree_bytes{instance=~\"$node:$port\",job=~\"$job\"}) / (node_memory_SwapTotal_bytes{instance=~\"$node:$port\",job=~\"$job\"} )) * 100", + "intervalFactor": 1, + "refId": "A", + "step": 900 + } + ], + "thresholds": "10,25", + "title": "Used SWAP", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": true, + "colors": [ + "rgba(50, 172, 45, 0.97)", + "rgba(237, 129, 40, 0.89)", + "rgba(245, 54, 54, 0.9)" + ], + "datasource": "Prometheus", + "decimals": null, + "description": "Used Root FS", + "format": "percent", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": true, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 12, + "y": 1 + }, + "id": 154, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "minSpan": 4, + "nullPointMode": "null", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": true + }, + "tableColumn": "", + "targets": [ + { + "expr": "100 - ((node_filesystem_avail_bytes{instance=~\"$node:$port\",job=~\"$job\",mountpoint=\"/\",fstype!=\"rootfs\"} * 100) / node_filesystem_size_bytes{instance=~\"$node:$port\",job=~\"$job\",mountpoint=\"/\",fstype!=\"rootfs\"})", + "format": "time_series", + "intervalFactor": 1, + "refId": "A", + "step": 900 + } + ], + "thresholds": "80,90", + "title": "Used Root FS", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": true, + "colors": [ + "rgba(50, 172, 45, 0.97)", + "rgba(237, 129, 40, 0.89)", + "rgba(245, 54, 54, 0.9)" + ], + "datasource": "Prometheus", + "decimals": null, + "description": "Busy state of all CPU cores together (1 min average)", + "format": "percent", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": true, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 16, + "y": 1 + }, + "id": 19, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "minSpan": 2, + "nullPointMode": "null", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": true + }, + "tableColumn": "", + "targets": [ + { + "expr": "avg(node_load1{instance=~\"$node:$port\",job=~\"$job\"}) / count(count(node_cpu_seconds_total{instance=~\"$node:$port\",job=~\"$job\"}) by (cpu)) * 100", + "hide": false, + "intervalFactor": 1, + "refId": "A", + "step": 900 + } + ], + "thresholds": "85, 95", + "title": "CPU System Load (1m avg)", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": true, + "colors": [ + "rgba(50, 172, 45, 0.97)", + "rgba(237, 129, 40, 0.89)", + "rgba(245, 54, 54, 0.9)" + ], + "datasource": "Prometheus", + "decimals": null, + "description": "Busy state of all CPU cores together (5 min average)", + "format": "percent", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": true, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 20, + "y": 1 + }, + "id": 155, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "minSpan": 2, + "nullPointMode": "null", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": true + }, + "tableColumn": "", + "targets": [ + { + "expr": "avg(node_load5{instance=~\"$node:$port\",job=~\"$job\"}) / count(count(node_cpu_seconds_total{instance=~\"$node:$port\",job=~\"$job\"}) by (cpu)) * 100", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "refId": "A", + "step": 900 + } + ], + "thresholds": "85, 95", + "title": "CPU System Load (5m avg)", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 5 + }, + "id": 262, + "panels": [], + "repeat": null, + "title": "Basic CPU / Mem / Disk Info", + "type": "row" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "Prometheus", + "description": "Total number of CPU cores", + "format": "short", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 4, + "x": 0, + "y": 6 + }, + "id": 14, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "minSpan": 4, + "nullPointMode": "null", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "count(count(node_cpu_seconds_total{instance=~\"$node:$port\",job=~\"$job\"}) by (cpu))", + "intervalFactor": 1, + "refId": "A", + "step": 900 + } + ], + "thresholds": "", + "title": "CPU Cores", + "type": "singlestat", + "valueFontSize": "50%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "Prometheus", + "decimals": 2, + "description": "Total RAM", + "format": "bytes", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 4, + "x": 4, + "y": 6 + }, + "id": 75, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "minSpan": 4, + "nullPointMode": "null", + "nullText": null, + "postfix": "", + "postfixFontSize": "70%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "node_memory_MemTotal_bytes{instance=~\"$node:$port\",job=~\"$job\"}", + "intervalFactor": 1, + "refId": "A", + "step": 900 + } + ], + "thresholds": "", + "title": "Total RAM", + "type": "singlestat", + "valueFontSize": "50%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "Prometheus", + "decimals": 2, + "description": "Total SWAP", + "format": "bytes", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 4, + "x": 8, + "y": 6 + }, + "id": 18, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "minSpan": 4, + "nullPointMode": "null", + "nullText": null, + "postfix": "", + "postfixFontSize": "70%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "node_memory_SwapTotal_bytes{instance=~\"$node:$port\",job=~\"$job\"}", + "intervalFactor": 1, + "refId": "A", + "step": 900 + } + ], + "thresholds": "", + "title": "Total SWAP", + "type": "singlestat", + "valueFontSize": "50%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(50, 172, 45, 0.97)", + "rgba(237, 129, 40, 0.89)", + "rgba(245, 54, 54, 0.9)" + ], + "datasource": "Prometheus", + "decimals": null, + "description": "Total RootFS", + "format": "bytes", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 4, + "x": 12, + "y": 6 + }, + "id": 23, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "minSpan": 4, + "nullPointMode": "null", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "node_filesystem_size_bytes{instance=~\"$node:$port\",job=~\"$job\",mountpoint=\"/\",fstype!=\"rootfs\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "refId": "A", + "step": 900 + } + ], + "thresholds": "70,90", + "title": "Total RootFS", + "type": "singlestat", + "valueFontSize": "50%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "Prometheus", + "decimals": 2, + "description": "System Load (1m avg)", + "format": "short", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 4, + "x": 16, + "y": 6 + }, + "id": 17, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "minSpan": 2, + "nullPointMode": "null", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "node_load1{instance=~\"$node:$port\",job=~\"$job\"}", + "hide": false, + "intervalFactor": 1, + "refId": "A", + "step": 900 + } + ], + "thresholds": "", + "title": "System Load (1m avg)", + "type": "singlestat", + "valueFontSize": "50%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "Prometheus", + "decimals": 1, + "description": "System uptime", + "format": "s", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 4, + "x": 20, + "y": 6 + }, + "hideTimeOverride": true, + "id": 15, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "null", + "nullText": null, + "postfix": "s", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "node_time_seconds{instance=~\"$node:$port\",job=~\"$job\"} - node_boot_time_seconds{instance=~\"$node:$port\",job=~\"$job\"}", + "intervalFactor": 2, + "refId": "A", + "step": 1800 + } + ], + "thresholds": "", + "title": "Uptime", + "transparent": false, + "type": "singlestat", + "valueFontSize": "50%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 9 + }, + "id": 263, + "panels": [], + "repeat": null, + "title": "Basic CPU / Mem Graph", + "type": "row" + }, + { + "aliasColors": { + "Busy": "#EAB839", + "Busy Iowait": "#890F02", + "Busy other": "#1F78C1", + "Idle": "#052B51", + "Idle - Waiting for something to happen": "#052B51", + "guest": "#9AC48A", + "idle": "#052B51", + "iowait": "#EAB839", + "irq": "#BF1B00", + "nice": "#C15C17", + "softirq": "#E24D42", + "steal": "#FCE2DE", + "system": "#508642", + "user": "#5195CE" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "description": "Basic CPU info", + "fill": 4, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 10 + }, + "id": 77, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "max": false, + "min": false, + "rightSide": false, + "show": true, + "sideWidth": 250, + "sort": null, + "sortDesc": null, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": true, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "Busy Iowait", + "color": "#890F02" + }, + { + "alias": "Idle", + "color": "#7EB26D" + }, + { + "alias": "Busy System", + "color": "#EAB839" + }, + { + "alias": "Busy User", + "color": "#0A437C" + }, + { + "alias": "Busy Other", + "color": "#6D1F62" + } + ], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum by (instance)(rate(node_cpu_seconds_total{mode=\"system\",instance=~\"$node:$port\",job=~\"$job\"}[5m])) * 100", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "Busy System", + "refId": "B", + "step": 240 + }, + { + "expr": "sum by (instance)(rate(node_cpu_seconds_total{mode='user',instance=~\"$node:$port\",job=~\"$job\"}[5m])) * 100", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "Busy User", + "refId": "D", + "step": 240 + }, + { + "expr": "sum by (instance)(rate(node_cpu_seconds_total{mode='iowait',instance=~\"$node:$port\",job=~\"$job\"}[5m])) * 100", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Busy Iowait", + "refId": "E", + "step": 240 + }, + { + "expr": "sum by (instance)(rate(node_cpu_seconds_total{mode=~\".*irq\",instance=~\"$node:$port\",job=~\"$job\"}[5m])) * 100", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Busy IRQs", + "refId": "F", + "step": 240 + }, + { + "expr": "sum (rate(node_cpu_seconds_total{mode!='idle',mode!='user',mode!='system',mode!='iowait',mode!='irq',mode!='softirq',instance=~\"$node:$port\",job=~\"$job\"}[5m])) * 100", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Busy Other", + "refId": "A", + "step": 240 + }, + { + "expr": "sum by (mode)(rate(node_cpu_seconds_total{mode='idle',instance=~\"$node:$port\",job=~\"$job\"}[5m])) * 100", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Idle", + "refId": "C", + "step": 240 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "CPU Basic", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "", + "logBase": 1, + "max": "100", + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Apps": "#629E51", + "Buffers": "#614D93", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Free": "#0A437C", + "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF", + "Inactive": "#584477", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "RAM_Free": "#E0F9D7", + "SWAP Used": "#BF1B00", + "Slab": "#806EB7", + "Slab_Cache": "#E0752D", + "Swap": "#BF1B00", + "Swap Used": "#BF1B00", + "Swap_Cache": "#C15C17", + "Swap_Free": "#2F575E", + "Unused": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "description": "Basic memory usage", + "fill": 4, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 10 + }, + "id": 78, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "max": false, + "min": false, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "RAM Total", + "color": "#E0F9D7", + "fill": 0, + "stack": false + }, + { + "alias": "RAM Cache + Buffer", + "color": "#052B51" + }, + { + "alias": "RAM Free", + "color": "#7EB26D" + }, + { + "alias": "Avaliable", + "color": "#DEDAF7", + "fill": 0, + "stack": false + } + ], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "node_memory_MemTotal_bytes{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "RAM Total", + "refId": "A", + "step": 240 + }, + { + "expr": "node_memory_MemTotal_bytes{instance=~\"$node:$port\",job=~\"$job\"} - node_memory_MemFree_bytes{instance=~\"$node:$port\",job=~\"$job\"} - (node_memory_Cached_bytes{instance=~\"$node:$port\",job=~\"$job\"} + node_memory_Buffers_bytes{instance=~\"$node:$port\",job=~\"$job\"})", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "RAM Used", + "refId": "D", + "step": 240 + }, + { + "expr": "node_memory_Cached_bytes{instance=~\"$node:$port\",job=~\"$job\"} + node_memory_Buffers_bytes{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "RAM Cache + Buffer", + "refId": "B", + "step": 240 + }, + { + "expr": "node_memory_MemFree_bytes{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "RAM Free", + "refId": "F", + "step": 240 + }, + { + "expr": "(node_memory_SwapTotal_bytes{instance=~\"$node:$port\",job=~\"$job\"} - node_memory_SwapFree_bytes{instance=~\"$node:$port\",job=~\"$job\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "SWAP Used", + "refId": "G", + "step": 240 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Basic", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "label": "", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 17 + }, + "id": 264, + "panels": [], + "repeat": null, + "title": "Basic Net / Disk Info", + "type": "row" + }, + { + "aliasColors": { + "Recv_bytes_eth2": "#7EB26D", + "Recv_bytes_lo": "#0A50A1", + "Recv_drop_eth2": "#6ED0E0", + "Recv_drop_lo": "#E0F9D7", + "Recv_errs_eth2": "#BF1B00", + "Recv_errs_lo": "#CCA300", + "Trans_bytes_eth2": "#7EB26D", + "Trans_bytes_lo": "#0A50A1", + "Trans_drop_eth2": "#6ED0E0", + "Trans_drop_lo": "#E0F9D7", + "Trans_errs_eth2": "#BF1B00", + "Trans_errs_lo": "#CCA300", + "recv_bytes_lo": "#0A50A1", + "recv_drop_eth0": "#99440A", + "recv_drop_lo": "#967302", + "recv_errs_eth0": "#BF1B00", + "recv_errs_lo": "#890F02", + "trans_bytes_eth0": "#7EB26D", + "trans_bytes_lo": "#0A50A1", + "trans_drop_eth0": "#99440A", + "trans_drop_lo": "#967302", + "trans_errs_eth0": "#BF1B00", + "trans_errs_lo": "#890F02" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "Basic network info per interface", + "fill": 4, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 18 + }, + "id": 74, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "hideEmpty": false, + "hideZero": false, + "max": false, + "min": false, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*trans.*/", + "transform": "negative-Y" + }, + { + "alias": "/.*lo.*/", + "color": "#7EB26D" + }, + { + "alias": "/.*eth0.*/", + "color": "#EAB839" + }, + { + "alias": "/.*eth1.*/", + "color": "#6ED0E0" + }, + { + "alias": "/.*eth2.*/", + "color": "#EF843C" + }, + { + "alias": "/.*eth3.*/", + "color": "#E24D42" + }, + { + "alias": "/.*eth4.*/", + "color": "#1F78C1" + }, + { + "alias": "/.*eth5.*/", + "color": "#BA43A9" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(node_network_receive_bytes_total{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "recv {{device}}", + "refId": "A", + "step": 240 + }, + { + "expr": "rate(node_network_transmit_bytes_total{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "trans {{device}} ", + "refId": "B", + "step": 240 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Network Traffic Basic", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "pps", + "label": "", + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 3, + "description": "Disk space used of all filesystems mounted", + "fill": 4, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 18 + }, + "height": "", + "id": 152, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "max": false, + "min": false, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "100 - ((node_filesystem_avail_bytes{instance=~\"$node:$port\",job=~\"$job\",device!~'rootfs'} * 100) / node_filesystem_size_bytes{instance=~\"$node:$port\",job=~\"$job\",device!~'rootfs'})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{mountpoint}}", + "refId": "A", + "step": 240 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Disk Space Used Basic", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "percent", + "label": null, + "logBase": 1, + "max": "100", + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 25 + }, + "id": 265, + "panels": [ + { + "aliasColors": { + "Idle - Waiting for something to happen": "#052B51", + "guest": "#9AC48A", + "idle": "#052B51", + "iowait": "#EAB839", + "irq": "#BF1B00", + "nice": "#C15C17", + "softirq": "#E24D42", + "steal": "#FCE2DE", + "system": "#508642", + "user": "#5195CE" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "description": "", + "fill": 4, + "gridPos": { + "h": 12, + "w": 12, + "x": 0, + "y": 26 + }, + "id": 3, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 250, + "sort": null, + "sortDesc": null, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": true, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum by (mode)(irate(node_cpu_seconds_total{mode=\"system\",instance=~\"$node:$port\",job=~\"$job\"}[5m])) * 100", + "format": "time_series", + "interval": "10s", + "intervalFactor": 2, + "legendFormat": "System - Processes executing in kernel mode", + "refId": "A", + "step": 20 + }, + { + "expr": "sum by (mode)(irate(node_cpu_seconds_total{mode='user',instance=~\"$node:$port\",job=~\"$job\"}[5m])) * 100", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "User - Normal processes executing in user mode", + "refId": "B", + "step": 240 + }, + { + "expr": "sum by (mode)(irate(node_cpu_seconds_total{mode='nice',instance=~\"$node:$port\",job=~\"$job\"}[5m])) * 100", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Nice - Niced processes executing in user mode", + "refId": "C", + "step": 240 + }, + { + "expr": "sum by (mode)(irate(node_cpu_seconds_total{mode='idle',instance=~\"$node:$port\",job=~\"$job\"}[5m])) * 100", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Idle - Waiting for something to happen", + "refId": "F", + "step": 240 + }, + { + "expr": "sum by (mode)(irate(node_cpu_seconds_total{mode='iowait',instance=~\"$node:$port\",job=~\"$job\"}[5m])) * 100", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Iowait - Waiting for I/O to complete", + "refId": "D", + "step": 240 + }, + { + "expr": "sum by (mode)(irate(node_cpu_seconds_total{mode='irq',instance=~\"$node:$port\",job=~\"$job\"}[5m])) * 100", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Irq - Servicing interrupts", + "refId": "G", + "step": 240 + }, + { + "expr": "sum by (mode)(irate(node_cpu_seconds_total{mode='softirq',instance=~\"$node:$port\",job=~\"$job\"}[5m])) * 100", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Softirq - Servicing softirqs", + "refId": "H", + "step": 240 + }, + { + "expr": "sum by (mode)(irate(node_cpu_seconds_total{mode='steal',instance=~\"$node:$port\",job=~\"$job\"}[5m])) * 100", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Steal - Time spent in other operating systems when running in a virtualized environment", + "refId": "E", + "step": 240 + }, + { + "expr": "sum by (mode)(irate(node_cpu_seconds_total{mode='guest',instance=~\"$node:$port\",job=~\"$job\"}[5m])) * 100", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Guest - Time spent running a virtual CPU for a guest operating system", + "refId": "I", + "step": 240 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "CPU", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Percentage", + "logBase": 1, + "max": "100", + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Apps": "#629E51", + "Buffers": "#614D93", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Free": "#0A437C", + "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF", + "Inactive": "#584477", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "RAM_Free": "#E0F9D7", + "Slab": "#806EB7", + "Slab_Cache": "#E0752D", + "Swap": "#BF1B00", + "Swap - Swap memory usage": "#BF1B00", + "Swap_Cache": "#C15C17", + "Swap_Free": "#2F575E", + "Unused": "#EAB839", + "Unused - Free memory unasigned": "#052B51" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "description": "", + "fill": 4, + "gridPos": { + "h": 12, + "w": 12, + "x": 12, + "y": 26 + }, + "id": 24, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "sort": null, + "sortDesc": null, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*Harware Corrupted - *./", + "stack": false + } + ], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "node_memory_MemTotal_bytes{instance=~\"$node:$port\",job=~\"$job\"} - node_memory_MemFree_bytes{instance=~\"$node:$port\",job=~\"$job\"} - node_memory_Buffers_bytes{instance=~\"$node:$port\",job=~\"$job\"} - node_memory_Cached_bytes{instance=~\"$node:$port\",job=~\"$job\"} - node_memory_Slab_bytes{instance=~\"$node:$port\",job=~\"$job\"} - node_memory_PageTables_bytes{instance=~\"$node:$port\",job=~\"$job\"} - node_memory_SwapCached_bytes{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "Apps - Memory used by user-space applications", + "refId": "Q", + "step": 240 + }, + { + "expr": "node_memory_PageTables_bytes{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "PageTables - Memory used to map between virtual and physical memory addresses", + "refId": "G", + "step": 240 + }, + { + "expr": "node_memory_SwapCached_bytes{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "SwapCache - Memory that keeps track of pages that have been fetched from swap but not yet been modified", + "refId": "F", + "step": 240 + }, + { + "expr": "node_memory_Slab_bytes{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "Slab - Memory used by the kernel to cache data structures for its own use (caches like inode, dentry, etc)", + "refId": "E", + "step": 240 + }, + { + "expr": "node_memory_Cached_bytes{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "Cache - Parked file data (file content) cache", + "refId": "C", + "step": 240 + }, + { + "expr": "node_memory_Buffers_bytes{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "Buffers - Block device (e.g. harddisk) cache", + "refId": "B", + "step": 240 + }, + { + "expr": "node_memory_MemFree_bytes{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "Unused - Free memory unasigned", + "refId": "D", + "step": 240 + }, + { + "expr": "(node_memory_SwapTotal_bytes{instance=~\"$node:$port\",job=~\"$job\"} - node_memory_SwapFree_bytes{instance=~\"$node:$port\",job=~\"$job\"})", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "Swap - Swap space used", + "refId": "I", + "step": 240 + }, + { + "expr": "node_memory_HardwareCorrupted_bytes{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working", + "refId": "O", + "step": 240 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Stack", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "label": "Bytes", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "receive_packets_eth0": "#7EB26D", + "receive_packets_lo": "#E24D42", + "transmit_packets_eth0": "#7EB26D", + "transmit_packets_lo": "#E24D42" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 4, + "gridPos": { + "h": 12, + "w": 12, + "x": 0, + "y": 38 + }, + "id": 84, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*Trans.*/", + "transform": "negative-Y" + }, + { + "alias": "/.*lo.*/", + "color": "#7EB26D" + }, + { + "alias": "/.*eth0.*/", + "color": "#EAB839" + }, + { + "alias": "/.*eth1.*/", + "color": "#6ED0E0" + }, + { + "alias": "/.*eth2.*/", + "color": "#EF843C" + }, + { + "alias": "/.*eth3.*/", + "color": "#E24D42" + }, + { + "alias": "/.*eth4.*/", + "color": "#1F78C1" + }, + { + "alias": "/.*eth5.*/", + "color": "#BA43A9" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_network_receive_bytes_total{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{device}} - Receive", + "refId": "O", + "step": 240 + }, + { + "expr": "irate(node_network_transmit_bytes_total{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{device}} - Transmit", + "refId": "P", + "step": 240 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Network Traffic", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "Bps", + "label": "Bytes out (-) / in (+)", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 3, + "description": "", + "fill": 4, + "gridPos": { + "h": 12, + "w": 12, + "x": 12, + "y": 38 + }, + "height": "", + "id": 156, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": false, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_filesystem_size_bytes{instance=~\"$node:$port\",job=~\"$job\",device!~'rootfs'} - node_filesystem_avail_bytes{instance=~\"$node:$port\",job=~\"$job\",device!~'rootfs'}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{mountpoint}}", + "refId": "A", + "step": 240 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Disk Space Used", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "label": "Bytes", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "", + "fill": 2, + "gridPos": { + "h": 12, + "w": 12, + "x": 0, + "y": 50 + }, + "id": 229, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideZero": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*Read.*/", + "transform": "negative-Y" + }, + { + "alias": "/.*sda_.*/", + "color": "#7EB26D" + }, + { + "alias": "/.*sdb_.*/", + "color": "#EAB839" + }, + { + "alias": "/.*sdc_.*/", + "color": "#6ED0E0" + }, + { + "alias": "/.*sdd_.*/", + "color": "#EF843C" + }, + { + "alias": "/.*sde_.*/", + "color": "#E24D42" + }, + { + "alias": "/.*sda1.*/", + "color": "#584477" + }, + { + "alias": "/.*sda2_.*/", + "color": "#BA43A9" + }, + { + "alias": "/.*sda3_.*/", + "color": "#F4D598" + }, + { + "alias": "/.*sdb1.*/", + "color": "#0A50A1" + }, + { + "alias": "/.*sdb2.*/", + "color": "#BF1B00" + }, + { + "alias": "/.*sdb3.*/", + "color": "#E0752D" + }, + { + "alias": "/.*sdc1.*/", + "color": "#962D82" + }, + { + "alias": "/.*sdc2.*/", + "color": "#614D93" + }, + { + "alias": "/.*sdc3.*/", + "color": "#9AC48A" + }, + { + "alias": "/.*sdd1.*/", + "color": "#65C5DB" + }, + { + "alias": "/.*sdd2.*/", + "color": "#F9934E" + }, + { + "alias": "/.*sdd3.*/", + "color": "#EA6460" + }, + { + "alias": "/.*sde1.*/", + "color": "#E0F9D7" + }, + { + "alias": "/.*sdd2.*/", + "color": "#FCEACA" + }, + { + "alias": "/.*sde3.*/", + "color": "#F9E2D2" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_disk_reads_completed_total{instance=~\"$node:$port\",job=~\"$job\",device=~\"[a-z]*[a-z]\"}[5m])", + "intervalFactor": 4, + "legendFormat": "{{device}} - Reads completed", + "refId": "A", + "step": 480 + }, + { + "expr": "irate(node_disk_writes_completed_total{instance=~\"$node:$port\",job=~\"$job\",device=~\"[a-z]*[a-z]\"}[5m])", + "intervalFactor": 2, + "legendFormat": "{{device}} - Writes completed", + "refId": "B", + "step": 240 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Disk IOps", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "iops", + "label": "IO read (-) / write (+)", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "io time": "#890F02" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 3, + "description": "", + "fill": 4, + "gridPos": { + "h": 12, + "w": 12, + "x": 12, + "y": 50 + }, + "id": 42, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sort": null, + "sortDesc": null, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*read*./", + "transform": "negative-Y" + }, + { + "alias": "/.*sda.*/", + "color": "#7EB26D" + }, + { + "alias": "/.*sdb.*/", + "color": "#EAB839" + }, + { + "alias": "/.*sdc.*/", + "color": "#6ED0E0" + }, + { + "alias": "/.*sdd.*/", + "color": "#EF843C" + }, + { + "alias": "/.*sde.*/", + "color": "#E24D42" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_disk_read_bytes_total{instance=~\"$node:$port\",job=~\"$job\",device=~\"[a-z]*[a-z]\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "{{device}} - Successfully read bytes", + "refId": "A", + "step": 240 + }, + { + "expr": "irate(node_disk_written_bytes_total{instance=~\"$node:$port\",job=~\"$job\",device=~\"[a-z]*[a-z]\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "{{device}} - Successfully written bytes", + "refId": "B", + "step": 240 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "I/O Usage Read / Write", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": false, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "label": "Bytes read (-) / write (+)", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "ms", + "label": "", + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + }, + { + "aliasColors": { + "io time": "#890F02" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 3, + "description": "", + "fill": 4, + "gridPos": { + "h": 12, + "w": 12, + "x": 0, + "y": 62 + }, + "id": 127, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sort": null, + "sortDesc": null, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_disk_io_time_seconds_total{instance=~\"$node:$port\",job=~\"$job\",device=~\"[a-z]*[a-z]\"} [5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "{{device}} - Milliseconds spent doing I/Os", + "refId": "C", + "step": 240 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "I/O Usage Times", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": false, + "values": [] + }, + "yaxes": [ + { + "format": "ms", + "label": "Milliseconds", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "ms", + "label": "", + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + } + ], + "repeat": null, + "title": "CPU Memory Net Disk", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 26 + }, + "id": 266, + "panels": [ + { + "aliasColors": { + "Apps": "#629E51", + "Buffers": "#614D93", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Free": "#0A437C", + "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF", + "Inactive": "#584477", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "RAM_Free": "#E0F9D7", + "Slab": "#806EB7", + "Slab_Cache": "#E0752D", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Swap_Free": "#2F575E", + "Unused": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 63 + }, + "id": 136, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 12, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "node_memory_Inactive_bytes{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Inactive - Memory which has been less recently used. It is more eligible to be reclaimed for other purposes", + "refId": "K", + "step": 4 + }, + { + "expr": "node_memory_Active_bytes{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Active - Memory that has been used more recently and usually not reclaimed unless absolutely necessary", + "refId": "J", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Active / Inactive", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "label": "Bytes", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Apps": "#629E51", + "Buffers": "#614D93", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Free": "#0A437C", + "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF", + "Inactive": "#584477", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "RAM_Free": "#E0F9D7", + "Slab": "#806EB7", + "Slab_Cache": "#E0752D", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Swap_Free": "#2F575E", + "Unused": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 63 + }, + "id": 135, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*Committed_AS - *./" + }, + { + "alias": "/.*CommitLimit - *./", + "color": "#BF1B00", + "fill": 0 + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_memory_Committed_AS_bytes{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Committed_AS - Amount of memory presently allocated on the system", + "refId": "A", + "step": 4 + }, + { + "expr": "node_memory_CommitLimit_bytes{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "CommitLimit - Amount of memory currently available to be allocated on the system", + "refId": "M", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Commited", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "label": "Bytes", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Apps": "#629E51", + "Buffers": "#614D93", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Free": "#0A437C", + "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF", + "Inactive": "#584477", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "RAM_Free": "#E0F9D7", + "Slab": "#806EB7", + "Slab_Cache": "#E0752D", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Swap_Free": "#2F575E", + "Unused": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 73 + }, + "id": 191, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "node_memory_Inactive_file_bytes{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "Inactive_file - File-backed memory on inactive LRU list", + "refId": "A", + "step": 4 + }, + { + "expr": "node_memory_Inactive_anon_bytes{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "Inactive_anon - Anonymous and swap cache on inactive LRU list, including tmpfs (shmem)", + "refId": "D", + "step": 4 + }, + { + "expr": "node_memory_Active_file_bytes{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "Active_file - File-backed memory on active LRU list", + "refId": "B", + "step": 4 + }, + { + "expr": "node_memory_Active_anon_bytes{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "Active_anon - Anonymous and swap cache on active least-recently-used (LRU) list, including tmpfs", + "refId": "C", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Active / Inactive Detail", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "label": "Bytes", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + }, + { + "aliasColors": { + "Active": "#99440A", + "Buffers": "#58140C", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Dirty": "#6ED0E0", + "Free": "#B7DBAB", + "Inactive": "#EA6460", + "Mapped": "#052B51", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "Slab_Cache": "#EAB839", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Total": "#511749", + "Total RAM": "#052B51", + "Total RAM + Swap": "#052B51", + "Total Swap": "#614D93", + "VmallocUsed": "#EA6460" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 73 + }, + "id": 130, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": null, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 12, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_memory_Writeback_bytes{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Writeback - Memory which is actively being written back to disk", + "refId": "J", + "step": 4 + }, + { + "expr": "node_memory_WritebackTmp_bytes{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "WritebackTmp - Memory used by FUSE for temporary writeback buffers", + "refId": "K", + "step": 4 + }, + { + "expr": "node_memory_Dirty_bytes{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Dirty - Memory which is waiting to get written back to the disk", + "refId": "A", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Writeback and Dirty", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "label": "Bytes", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Apps": "#629E51", + "Buffers": "#614D93", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Free": "#0A437C", + "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF", + "Inactive": "#584477", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "RAM_Free": "#E0F9D7", + "Slab": "#806EB7", + "Slab_Cache": "#E0752D", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Swap_Free": "#2F575E", + "Unused": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 83 + }, + "id": 138, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_memory_Mapped_bytes{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Mapped - Used memory in mapped pages files which have been mmaped, such as libraries", + "refId": "A", + "step": 4 + }, + { + "expr": "node_memory_Shmem_bytes{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Shmem - Used shared memory (shared between several processes, thus including RAM disks)", + "refId": "B", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Shared and Mapped", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "label": "Bytes", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Active": "#99440A", + "Buffers": "#58140C", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Dirty": "#6ED0E0", + "Free": "#B7DBAB", + "Inactive": "#EA6460", + "Mapped": "#052B51", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "Slab_Cache": "#EAB839", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Total": "#511749", + "Total RAM": "#052B51", + "Total RAM + Swap": "#052B51", + "Total Swap": "#614D93", + "VmallocUsed": "#EA6460" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 83 + }, + "id": 131, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": null, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 12, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "node_memory_SUnreclaim_bytes{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "SUnreclaim - Part of Slab, that cannot be reclaimed on memory pressure", + "refId": "O", + "step": 4 + }, + { + "expr": "node_memory_SReclaimable_bytes{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "SReclaimable - Part of Slab, that might be reclaimed, such as caches", + "refId": "N", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Slab", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "label": "Bytes", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Active": "#99440A", + "Buffers": "#58140C", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Dirty": "#6ED0E0", + "Free": "#B7DBAB", + "Inactive": "#EA6460", + "Mapped": "#052B51", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "Slab_Cache": "#EAB839", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Total": "#511749", + "Total RAM": "#052B51", + "Total RAM + Swap": "#052B51", + "VmallocUsed": "#EA6460" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 93 + }, + "id": 70, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": null, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_memory_VmallocChunk_bytes{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "VmallocChunk - Largest contigious block of vmalloc area which is free", + "refId": "H", + "step": 4 + }, + { + "expr": "node_memory_VmallocTotal_bytes{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "VmallocTotal - Total size of vmalloc memory area", + "refId": "I", + "step": 4 + }, + { + "expr": "node_memory_VmallocUsed_bytes{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "VmallocUsed - Amount of vmalloc area which is used", + "refId": "O", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Vmalloc", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "label": "Bytes", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Apps": "#629E51", + "Buffers": "#614D93", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Free": "#0A437C", + "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF", + "Inactive": "#584477", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "RAM_Free": "#E0F9D7", + "Slab": "#806EB7", + "Slab_Cache": "#E0752D", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Swap_Free": "#2F575E", + "Unused": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 93 + }, + "id": 159, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_memory_Bounce_bytes{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Bounce - Memory used for block device bounce buffers", + "refId": "N", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Bounce", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "label": "Bytes", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Active": "#99440A", + "Buffers": "#58140C", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Dirty": "#6ED0E0", + "Free": "#B7DBAB", + "Inactive": "#EA6460", + "Mapped": "#052B51", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "Slab_Cache": "#EAB839", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Total": "#511749", + "Total RAM": "#052B51", + "Total RAM + Swap": "#052B51", + "VmallocUsed": "#EA6460" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 103 + }, + "id": 129, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": null, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*Inactive *./", + "transform": "negative-Y" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_memory_AnonHugePages_bytes{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "AnonHugePages - Memory in anonymous huge pages", + "refId": "D", + "step": 4 + }, + { + "expr": "node_memory_AnonPages_bytes{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "AnonPages - Memory in user pages not backed by files", + "refId": "G", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Anonymous", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "label": "Bytes", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Apps": "#629E51", + "Buffers": "#614D93", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Free": "#0A437C", + "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF", + "Inactive": "#584477", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "RAM_Free": "#E0F9D7", + "Slab": "#806EB7", + "Slab_Cache": "#E0752D", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Swap_Free": "#2F575E", + "Unused": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 103 + }, + "id": 160, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 12, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_memory_KernelStack_bytes{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "KernelStack - Kernel memory stack. This is not reclaimable", + "refId": "N", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Kernel", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "label": "Bytes", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Active": "#99440A", + "Buffers": "#58140C", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Dirty": "#6ED0E0", + "Free": "#B7DBAB", + "Inactive": "#EA6460", + "Mapped": "#052B51", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "Slab_Cache": "#EAB839", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Total": "#511749", + "Total RAM": "#806EB7", + "Total RAM + Swap": "#806EB7", + "VmallocUsed": "#EA6460" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 113 + }, + "id": 140, + "legend": { + "alignAsTable": true, + "avg": false, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": null, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_memory_HugePages_Free{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "HugePages_Free - Huge pages in the pool that are not yet allocated", + "refId": "I", + "step": 4 + }, + { + "expr": "node_memory_HugePages_Rsvd{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "HugePages_Rsvd - Huge pages for which a commitment to allocate from the pool has been made, but no allocation has yet been made", + "refId": "J", + "step": 4 + }, + { + "expr": "node_memory_HugePages_Surp{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "HugePages_Surp - Huge pages in the pool above the value in /proc/sys/vm/nr_hugepages", + "refId": "K", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory HugePages Counter", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Pages", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": "", + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Active": "#99440A", + "Buffers": "#58140C", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Dirty": "#6ED0E0", + "Free": "#B7DBAB", + "Inactive": "#EA6460", + "Mapped": "#052B51", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "Slab_Cache": "#EAB839", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Total": "#511749", + "Total RAM": "#806EB7", + "Total RAM + Swap": "#806EB7", + "VmallocUsed": "#EA6460" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 113 + }, + "id": 71, + "legend": { + "alignAsTable": true, + "avg": false, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": null, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 12, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_memory_HugePages_Total{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "HugePages - Total size of the pool of huge pages", + "refId": "L", + "step": 4 + }, + { + "expr": "node_memory_Hugepagesize_bytes{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Hugepagesize - Huge Page size", + "refId": "D", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory HugePages Size", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "label": "Bytes", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": "", + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Active": "#99440A", + "Buffers": "#58140C", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Dirty": "#6ED0E0", + "Free": "#B7DBAB", + "Inactive": "#EA6460", + "Mapped": "#052B51", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "Slab_Cache": "#EAB839", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Total": "#511749", + "Total RAM": "#052B51", + "Total RAM + Swap": "#052B51", + "VmallocUsed": "#EA6460" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 123 + }, + "id": 128, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": null, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_memory_DirectMap1G{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "DirectMap1G - Amount of pages mapped as this size", + "refId": "J", + "step": 4 + }, + { + "expr": "node_memory_DirectMap2M_bytes{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "DirectMap2M - Amount of pages mapped as this size", + "refId": "K", + "step": 4 + }, + { + "expr": "node_memory_DirectMap4k_bytes{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "DirectMap4K - Amount of pages mapped as this size", + "refId": "L", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory DirectMap", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "label": "Bytes", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Apps": "#629E51", + "Buffers": "#614D93", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Free": "#0A437C", + "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF", + "Inactive": "#584477", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "RAM_Free": "#E0F9D7", + "Slab": "#806EB7", + "Slab_Cache": "#E0752D", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Swap_Free": "#2F575E", + "Unused": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 123 + }, + "id": 137, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_memory_Unevictable_bytes{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Unevictable - Amount of unevictable memory that can't be swapped out for a variety of reasons", + "refId": "P", + "step": 4 + }, + { + "expr": "node_memory_Mlocked_bytes{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "MLocked - Size of pages locked to memory using the mlock() system call", + "refId": "C", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Unevictable and MLocked", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "label": "Bytes", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Active": "#99440A", + "Buffers": "#58140C", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Dirty": "#6ED0E0", + "Free": "#B7DBAB", + "Inactive": "#EA6460", + "Mapped": "#052B51", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "Slab_Cache": "#EAB839", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Total": "#511749", + "Total RAM": "#052B51", + "Total RAM + Swap": "#052B51", + "Total Swap": "#614D93", + "VmallocUsed": "#EA6460" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 133 + }, + "id": 132, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": null, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_memory_NFS_Unstable_bytes{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "NFS Unstable - Memory in NFS pages sent to the server, but not yet commited to the storage", + "refId": "L", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory NFS", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "label": "Bytes", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + } + ], + "repeat": null, + "title": "Memory Detail Meminfo", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 27 + }, + "id": 267, + "panels": [ + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 134 + }, + "id": 176, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*out/", + "transform": "negative-Y" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_vmstat_pgpgin{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Pagesin - Page in operations", + "refId": "A", + "step": 4 + }, + { + "expr": "irate(node_vmstat_pgpgout{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Pagesout - Page out operations", + "refId": "B", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Pages In / Out", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Pages out (-) / in (+)", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 134 + }, + "id": 22, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*out/", + "transform": "negative-Y" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_vmstat_pswpin{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Pswpin - Pages swapped in", + "refId": "A", + "step": 4 + }, + { + "expr": "irate(node_vmstat_pswpout{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Pswpout - Pages swapped out", + "refId": "B", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Pages Swap In / Out", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Pages out (-) / in (+)", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Apps": "#629E51", + "Buffers": "#614D93", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Free": "#0A437C", + "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF", + "Inactive": "#584477", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "RAM_Free": "#E0F9D7", + "Slab": "#806EB7", + "Slab_Cache": "#E0752D", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Swap_Free": "#2F575E", + "Unused": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 144 + }, + "id": 197, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_vmstat_pgdeactivate{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Pgdeactivate - Pages moved from active to inactive", + "refId": "B", + "step": 4 + }, + { + "expr": "irate(node_vmstat_pgfree{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Pgfree - Page free operations", + "refId": "D", + "step": 4 + }, + { + "expr": "irate(node_vmstat_pgactivate{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Pgactivate - Pages moved from inactive to active", + "refId": "A", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Page Operations", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Pages", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Apps": "#629E51", + "Buffers": "#614D93", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Free": "#0A437C", + "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF", + "Inactive": "#584477", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "RAM_Free": "#E0F9D7", + "Slab": "#806EB7", + "Slab_Cache": "#E0752D", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Swap_Free": "#2F575E", + "Unused": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 144 + }, + "id": 175, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "Pgfault - Page major and minor fault operations", + "fill": 0, + "stack": false + } + ], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_vmstat_pgfault{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Pgfault - Page major and minor fault operations", + "refId": "C", + "step": 4 + }, + { + "expr": "irate(node_vmstat_pgmajfault{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Pgmajfault - Major page fault operations", + "refId": "F", + "step": 4 + }, + { + "expr": "irate(node_vmstat_pgfault{instance=~\"$node:$port\",job=~\"$job\"}[5m]) - irate(node_vmstat_pgmajfault{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Pgminfault - Minor page fault operations", + "refId": "A", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Page Faults", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Faults", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Apps": "#629E51", + "Buffers": "#614D93", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Free": "#0A437C", + "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF", + "Inactive": "#584477", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "RAM_Free": "#E0F9D7", + "Slab": "#806EB7", + "Slab_Cache": "#E0752D", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Swap_Free": "#2F575E", + "Unused": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 154 + }, + "id": 172, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 12, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_vmstat_kswapd_inodesteal{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Kswapd_inodesteal - Pages reclaimed via kswapd inode freeing", + "refId": "A", + "step": 4 + }, + { + "expr": "irate(node_vmstat_pginodesteal{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Pgindesteal - Pages reclaimed via inode freeing", + "refId": "B", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Pages Reclaimed", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Pages", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Apps": "#629E51", + "Buffers": "#614D93", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Free": "#0A437C", + "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF", + "Inactive": "#584477", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "RAM_Free": "#E0F9D7", + "Slab": "#806EB7", + "Slab_Cache": "#E0752D", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Swap_Free": "#2F575E", + "Unused": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 154 + }, + "id": 184, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_vmstat_pageoutrun{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Pageoutrun - Kswapd calls to page reclaim", + "refId": "A", + "step": 4 + }, + { + "expr": "irate(node_vmstat_allocstall{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "intervalFactor": 2, + "legendFormat": "Allocstall - Direct reclaim calls", + "refId": "B", + "step": 4 + }, + { + "expr": "irate(node_vmstat_zone_reclaim_failed{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "intervalFactor": 2, + "legendFormat": "Zone_reclaim_failed - Zone reclaim failures", + "refId": "C", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Calls Reclaimed", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Calls", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Apps": "#629E51", + "Buffers": "#614D93", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Free": "#0A437C", + "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF", + "Inactive": "#584477", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "RAM_Free": "#E0F9D7", + "Slab": "#806EB7", + "Slab_Cache": "#E0752D", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Swap_Free": "#2F575E", + "Unused": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 164 + }, + "id": 200, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_vmstat_pgrotated{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Pgrotated - Pages rotated to tail of the LRU", + "refId": "D", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Page Rotate", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Pages", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Apps": "#629E51", + "Buffers": "#614D93", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Free": "#0A437C", + "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF", + "Inactive": "#584477", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "RAM_Free": "#E0F9D7", + "Slab": "#806EB7", + "Slab_Cache": "#E0752D", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Swap_Free": "#2F575E", + "Unused": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 164 + }, + "id": 170, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 12, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_vmstat_drop_pagecache{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Drop_pagecache - Calls to drop page cache pages", + "refId": "N", + "step": 4 + }, + { + "expr": "node_vmstat_drop_slab{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Drop_slab - Calls to drop slab cache pages", + "refId": "A", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Page Drop", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Calls", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Apps": "#629E51", + "Buffers": "#614D93", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Free": "#0A437C", + "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF", + "Inactive": "#584477", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "RAM_Free": "#E0F9D7", + "Slab": "#806EB7", + "Slab_Cache": "#E0752D", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Swap_Free": "#2F575E", + "Unused": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 174 + }, + "id": 183, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_vmstat_slabs_scanned{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Slabs_scanned - Slab pages scanned", + "refId": "B", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Scan Slab", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Pages", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Apps": "#629E51", + "Buffers": "#614D93", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Free": "#0A437C", + "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF", + "Inactive": "#584477", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "RAM_Free": "#E0F9D7", + "Slab": "#806EB7", + "Slab_Cache": "#E0752D", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Swap_Free": "#2F575E", + "Unused": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 174 + }, + "id": 181, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 12, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_vmstat_unevictable_pgs_cleared{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Unevictable_pgs_cleared - Unevictable pages cleared", + "refId": "B", + "step": 4 + }, + { + "expr": "irate(node_vmstat_unevictable_pgs_culled{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Unevictable_pgs_culled - Unevictable pages culled", + "refId": "C", + "step": 4 + }, + { + "expr": "irate(node_vmstat_unevictable_pgs_mlocked{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Unevictable_pgs_mlocked - Unevictable pages mlocked", + "refId": "D", + "step": 4 + }, + { + "expr": "irate(node_vmstat_unevictable_pgs_munlocked{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Unevictable_pgs_munlocked - Unevictable pages munlocked", + "refId": "E", + "step": 4 + }, + { + "expr": "irate(node_vmstat_unevictable_pgs_rescued{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Unevictable_pgs_rescued- Unevictable pages rescued", + "refId": "F", + "step": 4 + }, + { + "expr": "irate(node_vmstat_unevictable_pgs_scanned{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Unevictable_pgs_scanned - Unevictable pages scanned", + "refId": "G", + "step": 4 + }, + { + "expr": "irate(node_vmstat_unevictable_pgs_stranded{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "unevictable_pgs_stranded - Unevictable pages stranded", + "refId": "H", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Unevictable Pages", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Pages", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Apps": "#629E51", + "Buffers": "#614D93", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Free": "#0A437C", + "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF", + "Inactive": "#584477", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "RAM_Free": "#E0F9D7", + "Slab": "#806EB7", + "Slab_Cache": "#E0752D", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Swap_Free": "#2F575E", + "Unused": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 184 + }, + "id": 174, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_vmstat_pgalloc_dma{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Pgalloc_dma - Dma mem page allocations", + "refId": "A", + "step": 4 + }, + { + "expr": "irate(node_vmstat_pgalloc_dma32{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Pgalloc_dma32 - Dma32 mem page allocations", + "refId": "B", + "step": 4 + }, + { + "expr": "irate(node_vmstat_pgalloc_movable{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Pgalloc_movable - Movable mem page allocations", + "refId": "C", + "step": 4 + }, + { + "expr": "irate(node_vmstat_pgalloc_normal{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Pgalloc_normal - Normal mem page allocations", + "refId": "D", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Page Allocation", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Pages", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Apps": "#629E51", + "Buffers": "#614D93", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Free": "#0A437C", + "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF", + "Inactive": "#584477", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "RAM_Free": "#E0F9D7", + "Slab": "#806EB7", + "Slab_Cache": "#E0752D", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Swap_Free": "#2F575E", + "Unused": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 184 + }, + "id": 177, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_vmstat_pgrefill_dma{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Pgrefill_dma - Dma mem pages inspected in refill_inactive_zone", + "refId": "B", + "step": 4 + }, + { + "expr": "irate(node_vmstat_pgrefill_dma32{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Pgrefill_dma32 - Dma32 mem pages inspected in refill_inactive_zone", + "refId": "C", + "step": 4 + }, + { + "expr": "irate(node_vmstat_pgrefill_movable{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Pgrefill_movable - Movable mem pages inspected in refill_inactive_zone", + "refId": "D", + "step": 4 + }, + { + "expr": "irate(node_vmstat_pgrefill_normal{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Pgrefill_normal - Normal mem pages inspected in refill_inactive_zone", + "refId": "E", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Page Refill", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Pages", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Apps": "#629E51", + "Buffers": "#614D93", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Free": "#0A437C", + "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF", + "Inactive": "#584477", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "RAM_Free": "#E0F9D7", + "Slab": "#806EB7", + "Slab_Cache": "#E0752D", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Swap_Free": "#2F575E", + "Unused": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 194 + }, + "id": 179, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_vmstat_pgsteal_direct_dma{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Pgsteal_direct_dma - Dma mem pages stealed", + "refId": "B", + "step": 4 + }, + { + "expr": "irate(node_vmstat_pgsteal_direct_dma32{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Pgsteal_direct_dma32 - Dma32 mem pages scanned", + "refId": "C", + "step": 4 + }, + { + "expr": "irate(node_vmstat_pgsteal_direct_movable{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Pgsteal_direct_movable - Movable mem pages scanned", + "refId": "D", + "step": 4 + }, + { + "expr": "irate(node_vmstat_pgsteal_direct_normal{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Pgsteal_direct_normal - Normal mem pages scanned", + "refId": "E", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Page Steal Direct", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Pages", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Apps": "#629E51", + "Buffers": "#614D93", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Free": "#0A437C", + "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF", + "Inactive": "#584477", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "RAM_Free": "#E0F9D7", + "Slab": "#806EB7", + "Slab_Cache": "#E0752D", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Swap_Free": "#2F575E", + "Unused": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 194 + }, + "id": 198, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_vmstat_pgsteal_kswapd_dma{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Pgsteal_kswapd_dma - Dma mem pages scanned by kswapd", + "refId": "F", + "step": 4 + }, + { + "expr": "irate(node_vmstat_pgsteal_kswapd_dma32{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Pgsteal_kswapd_dma32 - Dma32 mem pages scanned by kswapd", + "refId": "G", + "step": 4 + }, + { + "expr": "irate(node_vmstat_pgsteal_kswapd_movable{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Pgsteal_kswapd_movable - Movable mem pages scanned by kswapd", + "refId": "H", + "step": 4 + }, + { + "expr": "irate(node_vmstat_pgsteal_kswapd_normal{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Pgsteal_kswapd_normal - Normal mem pages scanned by kswapd", + "refId": "I", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Page Steal Kswapd", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Pages", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Apps": "#629E51", + "Buffers": "#614D93", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Free": "#0A437C", + "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF", + "Inactive": "#584477", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "RAM_Free": "#E0F9D7", + "Slab": "#806EB7", + "Slab_Cache": "#E0752D", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Swap_Free": "#2F575E", + "Unused": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 204 + }, + "id": 192, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 12, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_vmstat_pgscan_direct_dma{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Pgscan_direct_dma - Dma mem pages scanned", + "refId": "A", + "step": 4 + }, + { + "expr": "irate(node_vmstat_pgscan_direct_dma32{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Pgscan_direct_dma32 - Dma32 mem pages scanned", + "refId": "C", + "step": 4 + }, + { + "expr": "irate(node_vmstat_pgscan_direct_movable{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Pgscan_direct_movable - Movable mem pages scanned", + "refId": "D", + "step": 4 + }, + { + "expr": "irate(node_vmstat_pgscan_direct_normal{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Pgscan_direct_normal - Normal mem pages scanned", + "refId": "E", + "step": 4 + }, + { + "expr": "irate(node_vmstat_pgscan_direct_throttle{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": true, + "intervalFactor": 2, + "legendFormat": "Pgscan_direct_throttle - ", + "refId": "F", + "step": 2 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Scan Direct", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Pages", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Apps": "#629E51", + "Buffers": "#614D93", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Free": "#0A437C", + "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF", + "Inactive": "#584477", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "RAM_Free": "#E0F9D7", + "Slab": "#806EB7", + "Slab_Cache": "#E0752D", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Swap_Free": "#2F575E", + "Unused": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 204 + }, + "id": 178, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 12, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_vmstat_pgscan_kswapd_dma{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Pgscan_kswapd_dma - Dma mem pages scanned by kswapd", + "refId": "B", + "step": 4 + }, + { + "expr": "irate(node_vmstat_pgscan_kswapd_dma32{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Pgscan_kswapd_dma32 - Dma32 mem pages scanned by kswapd", + "refId": "G", + "step": 4 + }, + { + "expr": "irate(node_vmstat_pgscan_kswapd_movable{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Pgscan_kswapd_movable - Movable mem pages scanned by kswapd", + "refId": "H", + "step": 4 + }, + { + "expr": "irate(node_vmstat_pgscan_kswapd_normal{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Pgscan_kswapd_normal - Normal mem pages scanned by kswapd", + "refId": "I", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Scan Kswapd", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Pages", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Active": "#99440A", + "Buffers": "#58140C", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Dirty": "#6ED0E0", + "Free": "#B7DBAB", + "Inactive": "#EA6460", + "Mapped": "#052B51", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "Slab_Cache": "#EAB839", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Total": "#511749", + "Total RAM": "#052B51", + "Total RAM + Swap": "#052B51", + "Total Swap": "#614D93", + "VmallocUsed": "#EA6460" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 214 + }, + "id": 169, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": null, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 12, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*fail*./", + "color": "#890F02" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_vmstat_compact_free_scanned{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Compact_free_scanned - Pages scanned for freeing by compaction daemon", + "refId": "B", + "step": 4 + }, + { + "expr": "irate(node_vmstat_compact_isolated{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Compact_isolated - Page isolations for memory compaction", + "refId": "C", + "step": 4 + }, + { + "expr": "irate(node_vmstat_compact_migrate_scanned{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Compact_migrate_scanned - Pages scanned for migration by compaction daemon", + "refId": "D", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Page Compact", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Pages", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Active": "#99440A", + "Buffers": "#58140C", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Dirty": "#6ED0E0", + "Free": "#B7DBAB", + "Inactive": "#EA6460", + "Mapped": "#052B51", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "Slab_Cache": "#EAB839", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Total": "#511749", + "Total RAM": "#052B51", + "Total RAM + Swap": "#052B51", + "Total Swap": "#614D93", + "VmallocUsed": "#EA6460" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 214 + }, + "id": 189, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": null, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 12, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*fail*./", + "color": "#890F02" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_vmstat_compact_fail{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Compact_fail - Unsuccessful compactions for high order allocations", + "refId": "A", + "step": 4 + }, + { + "expr": "irate(node_vmstat_compact_stall{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Compact_stall - Failures to even start compacting", + "refId": "E", + "step": 4 + }, + { + "expr": "irate(node_vmstat_compact_success{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Compact_sucess - Successful compactions for high order allocations", + "refId": "F", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Compactions", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Compactions", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Apps": "#629E51", + "Buffers": "#614D93", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Free": "#0A437C", + "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF", + "Inactive": "#584477", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "RAM_Free": "#E0F9D7", + "Slab": "#806EB7", + "Slab_Cache": "#E0752D", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Swap_Free": "#2F575E", + "Unused": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 224 + }, + "id": 190, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 12, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_vmstat_kswapd_high_wmark_hit_quickly{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Kswapd_high_wmark_hit_quickly - Times high watermark reached quickly", + "refId": "N", + "step": 4 + }, + { + "expr": "node_vmstat_kswapd_low_wmark_hit_quickly{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Kswapd_low_wmark_hit_quickly - Times low watermark reached quickly", + "refId": "B", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Kswapd Watermark", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Counter", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Apps": "#629E51", + "Buffers": "#614D93", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Free": "#0A437C", + "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF", + "Inactive": "#584477", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "RAM_Free": "#E0F9D7", + "Slab": "#806EB7", + "Slab_Cache": "#E0752D", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Swap_Free": "#2F575E", + "Unused": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 224 + }, + "id": 171, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 12, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_vmstat_htlb_buddy_alloc_fail{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Htlb_buddy_alloc_fail - Huge TLB page buddy allocation failures", + "refId": "N", + "step": 4 + }, + { + "expr": "node_vmstat_htlb_buddy_alloc_success{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Htlb_buddy_alloc_success - Huge TLB page buddy allocation successes", + "refId": "A", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Buddy Alloc", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Allocations", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Apps": "#629E51", + "Buffers": "#614D93", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Free": "#0A437C", + "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF", + "Inactive": "#584477", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "RAM_Free": "#E0F9D7", + "Slab": "#806EB7", + "Slab_Cache": "#E0752D", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Swap_Free": "#2F575E", + "Unused": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 234 + }, + "id": 173, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_vmstat_numa_foreign{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Numa_foreign - Foreign NUMA zone allocations", + "refId": "A", + "step": 4 + }, + { + "expr": "irate(node_vmstat_numa_hit{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Numa_hit - Successful allocations from preferred NUMA zone", + "refId": "D", + "step": 4 + }, + { + "expr": "irate(node_vmstat_numa_interleave{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Numa_interleave - Interleaved NUMA allocations in each zone for each NUMA node", + "refId": "F", + "step": 4 + }, + { + "expr": "irate(node_vmstat_numa_local{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Numa_local - Successful allocations from local NUMA zone", + "refId": "G", + "step": 4 + }, + { + "expr": "irate(node_vmstat_numa_miss{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Numa_miss - Unsuccessful allocations from preferred NUMA zona", + "refId": "H", + "step": 4 + }, + { + "expr": "irate(node_vmstat_numa_other{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Numa_other - Unsuccessful allocations from local NUMA zone", + "refId": "I", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Numa Allocations", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Allocations", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Apps": "#629E51", + "Buffers": "#614D93", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Free": "#0A437C", + "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF", + "Inactive": "#584477", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "RAM_Free": "#E0F9D7", + "Slab": "#806EB7", + "Slab_Cache": "#E0752D", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Swap_Free": "#2F575E", + "Unused": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 234 + }, + "id": 193, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 12, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*Numa_pages_migrated - *./", + "fill": 0, + "stack": false + } + ], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_vmstat_numa_pages_migrated{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Numa_pages_migrated - NUMA page migrations", + "refId": "J", + "step": 4 + }, + { + "expr": "irate(node_vmstat_pgmigrate_fail{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Pgmigrate_fail - Unsuccessful NUMA page migrations", + "refId": "A", + "step": 4 + }, + { + "expr": "irate(node_vmstat_pgmigrate_success{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Pgmigrate_success - Successful NUMA page migrations", + "refId": "B", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Numa Page Migrations", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Pages", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Apps": "#629E51", + "Buffers": "#614D93", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Free": "#0A437C", + "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF", + "Inactive": "#584477", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "RAM_Free": "#E0F9D7", + "Slab": "#806EB7", + "Slab_Cache": "#E0752D", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Swap_Free": "#2F575E", + "Unused": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 244 + }, + "id": 194, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 12, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_vmstat_numa_hint_faults{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Numa_hint_faults - NUMA hint faults trapped", + "refId": "B", + "step": 4 + }, + { + "expr": "irate(node_vmstat_numa_hint_faults_local{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Numa_hint_faults_local - Hinting faults to local nodes", + "refId": "C", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Numa Hints", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "HInts", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Apps": "#629E51", + "Buffers": "#614D93", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Free": "#0A437C", + "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF", + "Inactive": "#584477", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "RAM_Free": "#E0F9D7", + "Slab": "#806EB7", + "Slab_Cache": "#E0752D", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Swap_Free": "#2F575E", + "Unused": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 244 + }, + "id": 196, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 12, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_vmstat_numa_pte_updates{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Numa_pte_updates - NUMA page table entry updates", + "refId": "K", + "step": 4 + }, + { + "expr": "irate(node_vmstat_numa_huge_pte_updates{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "intervalFactor": 2, + "legendFormat": "Numa_huge_pte_updates - NUMA huge page table entry updates", + "refId": "A", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Numa Table Updates", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Updates", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Apps": "#629E51", + "Buffers": "#614D93", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Free": "#0A437C", + "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF", + "Inactive": "#584477", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "RAM_Free": "#E0F9D7", + "Slab": "#806EB7", + "Slab_Cache": "#E0752D", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Swap_Free": "#2F575E", + "Unused": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 254 + }, + "id": 199, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_vmstat_thp_split{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Thp_split - Transparent huge page splits", + "refId": "F", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory THP Splits", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Splits", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Apps": "#629E51", + "Buffers": "#614D93", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Free": "#0A437C", + "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF", + "Inactive": "#584477", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "RAM_Free": "#E0F9D7", + "Slab": "#806EB7", + "Slab_Cache": "#E0752D", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Swap_Free": "#2F575E", + "Unused": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 254 + }, + "id": 182, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_vmstat_workingset_activate{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Workingset_activate - Page activations to form the working set", + "refId": "C", + "step": 4 + }, + { + "expr": "irate(node_vmstat_workingset_nodereclaim{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Workingset_nodereclaim - NUMA node working set page reclaims", + "refId": "D", + "step": 4 + }, + { + "expr": "irate(node_vmstat_workingset_refault{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Workingset_refault - Refaults of previously evicted pages", + "refId": "E", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Workingset", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Counter", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Apps": "#629E51", + "Buffers": "#614D93", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Free": "#0A437C", + "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF", + "Inactive": "#584477", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "RAM_Free": "#E0F9D7", + "Slab": "#806EB7", + "Slab_Cache": "#E0752D", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Swap_Free": "#2F575E", + "Unused": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 264 + }, + "id": 180, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_vmstat_thp_collapse_alloc{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Thp_collapse_alloc - Transparent huge page collapse allocations", + "refId": "A", + "step": 4 + }, + { + "expr": "irate(node_vmstat_thp_collapse_alloc_failed{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Thp_collapse_alloc_failed - Transparent huge page collapse allocation failures", + "refId": "C", + "step": 4 + }, + { + "expr": "irate(node_vmstat_thp_zero_page_alloc{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Thp_zero_page_alloc - Transparent huge page zeroed page allocations", + "refId": "G", + "step": 4 + }, + { + "expr": "irate(node_vmstat_thp_zero_page_alloc_failed{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Thp_zero_page_alloc_failed - Transparent huge page zeroed page allocation failures", + "refId": "H", + "step": 4 + }, + { + "expr": "irate(node_vmstat_thp_fault_alloc{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "intervalFactor": 2, + "legendFormat": "Thp_fault_alloc - Transparent huge page fault allocations", + "refId": "B", + "step": 4 + }, + { + "expr": "irate(node_vmstat_thp_fault_fallback{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "intervalFactor": 2, + "legendFormat": "Thp_fault_fallback - Transparent huge page fault fallbacks", + "refId": "D", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory THP Allocations", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Allocations", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + } + ], + "repeat": null, + "title": "Memory Detail Vmstat", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 28 + }, + "id": 268, + "panels": [ + { + "aliasColors": { + "Apps": "#629E51", + "Buffers": "#614D93", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Free": "#0A437C", + "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF", + "Inactive": "#584477", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "RAM_Free": "#E0F9D7", + "Slab": "#806EB7", + "Slab_Cache": "#E0752D", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Swap_Free": "#2F575E", + "Unused": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 265 + }, + "id": 185, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_vmstat_nr_active_anon{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Active_anon - Active anonymous memory pages", + "refId": "B", + "step": 240 + }, + { + "expr": "node_vmstat_nr_active_file{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Active_file - Active file memory memory pages", + "refId": "C", + "step": 240 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Page Active", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Pages", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Apps": "#629E51", + "Buffers": "#614D93", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Free": "#0A437C", + "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF", + "Inactive": "#584477", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "RAM_Free": "#E0F9D7", + "Slab": "#806EB7", + "Slab_Cache": "#E0752D", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Swap_Free": "#2F575E", + "Unused": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 265 + }, + "id": 228, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_vmstat_nr_inactive_anon{instance=~\"$node:$port\",job=~\"$job\"}", + "intervalFactor": 2, + "legendFormat": "Inactive_anon - Inactive anonymous memory pages in each zone for each NUMA node", + "refId": "A", + "step": 240 + }, + { + "expr": "node_vmstat_nr_inactive_file{instance=~\"$node:$port\",job=~\"$job\"}", + "intervalFactor": 2, + "legendFormat": "Inactive_file - Inactive file memory pages in each zone for each NUMA node", + "refId": "D", + "step": 240 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Page Inactive", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Pages", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Apps": "#629E51", + "Buffers": "#614D93", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Free": "#0A437C", + "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF", + "Inactive": "#584477", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "RAM_Free": "#E0F9D7", + "Slab": "#806EB7", + "Slab_Cache": "#E0752D", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Swap_Free": "#2F575E", + "Unused": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 275 + }, + "id": 188, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_vmstat_nr_slab_reclaimable{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Reclaimable - Instantaneous reclaimable slab pages", + "refId": "A", + "step": 240 + }, + { + "expr": "node_vmstat_nr_slab_unreclaimable{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Unreclaimable - Instantaneous unreclaimable slab pages", + "refId": "C", + "step": 240 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Page Reclaimed / Unreclaimed", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Pages", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Apps": "#629E51", + "Buffers": "#614D93", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Free": "#0A437C", + "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF", + "Inactive": "#584477", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "RAM_Free": "#E0F9D7", + "Slab": "#806EB7", + "Slab_Cache": "#E0752D", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Swap_Free": "#2F575E", + "Unused": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 275 + }, + "id": 186, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_vmstat_nr_free_pages{instance=~\"$node:$port\",job=~\"$job\"}", + "intervalFactor": 2, + "legendFormat": "Free_pages - Free pages", + "refId": "B", + "step": 240 + }, + { + "expr": "node_vmstat_nr_written{instance=~\"$node:$port\",job=~\"$job\"}", + "intervalFactor": 2, + "legendFormat": "Written - Pages written out in each zone for each NUMA node", + "refId": "A", + "step": 240 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Page Free / Written", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Pages", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Apps": "#629E51", + "Buffers": "#614D93", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Free": "#0A437C", + "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF", + "Inactive": "#584477", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "RAM_Free": "#E0F9D7", + "Slab": "#806EB7", + "Slab_Cache": "#E0752D", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Swap_Free": "#2F575E", + "Unused": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 285 + }, + "id": 218, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_vmstat_nr_dirty{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Dirty - Pages in dirty state", + "refId": "C", + "step": 240 + }, + { + "expr": "node_vmstat_nr_bounce{instance=~\"$node:$port\",job=~\"$job\"}", + "intervalFactor": 2, + "legendFormat": "Bounce - Bounce buffer pages", + "refId": "A", + "step": 240 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Page Dirty / Bounce", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Pages", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Apps": "#629E51", + "Buffers": "#614D93", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Free": "#0A437C", + "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF", + "Inactive": "#584477", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "RAM_Free": "#E0F9D7", + "Slab": "#806EB7", + "Slab_Cache": "#E0752D", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Swap_Free": "#2F575E", + "Unused": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 285 + }, + "id": 201, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_vmstat_nr_unevictable{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Unevictable - Unevictable pages", + "refId": "B", + "step": 240 + }, + { + "expr": "node_vmstat_nr_mlock{instance=~\"$node:$port\",job=~\"$job\"}", + "intervalFactor": 2, + "legendFormat": "Mlock - Pages under mlock", + "refId": "A", + "step": 240 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Pages Unevictable / Mlock", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Pages", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Apps": "#629E51", + "Buffers": "#614D93", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Free": "#0A437C", + "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF", + "Inactive": "#584477", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "RAM_Free": "#E0F9D7", + "Slab": "#806EB7", + "Slab_Cache": "#E0752D", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Swap_Free": "#2F575E", + "Unused": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 295 + }, + "id": 214, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_vmstat_nr_shmem{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Shmem - Shared memory pages", + "refId": "H", + "step": 240 + }, + { + "expr": "node_vmstat_nr_mapped{instance=~\"$node:$port\",job=~\"$job\"}", + "intervalFactor": 2, + "legendFormat": "Mapped - Mapped pagecache pages in each zone for each NUMA node", + "refId": "A", + "step": 240 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Page Shmem / Mapped", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Pages", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Apps": "#629E51", + "Buffers": "#614D93", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Free": "#0A437C", + "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF", + "Inactive": "#584477", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "RAM_Free": "#E0F9D7", + "Slab": "#806EB7", + "Slab_Cache": "#E0752D", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Swap_Free": "#2F575E", + "Unused": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 295 + }, + "id": 212, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_vmstat_nr_kernel_stack{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Kernel_stack - Pages of kernel stack", + "refId": "F", + "step": 240 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Page Kernel_stack", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Pages", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Apps": "#629E51", + "Buffers": "#614D93", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Free": "#0A437C", + "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF", + "Inactive": "#584477", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "RAM_Free": "#E0F9D7", + "Slab": "#806EB7", + "Slab_Cache": "#E0752D", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Swap_Free": "#2F575E", + "Unused": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 305 + }, + "id": 203, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_vmstat_nr_writeback{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Writeback - Writeback pages", + "refId": "G", + "step": 240 + }, + { + "expr": "node_vmstat_nr_writeback_temp{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Writeback_temp - Temporary writeback pages", + "refId": "H", + "step": 240 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Pages Writeback", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Pages", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Apps": "#629E51", + "Buffers": "#614D93", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Free": "#0A437C", + "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF", + "Inactive": "#584477", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "RAM_Free": "#E0F9D7", + "Slab": "#806EB7", + "Slab_Cache": "#E0752D", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Swap_Free": "#2F575E", + "Unused": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 305 + }, + "id": 205, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_vmstat_nr_file_pages{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "File_pages - File pagecache pages in each zone for each NUMA node", + "refId": "F", + "step": 240 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Page File_pages", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Pages", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Apps": "#629E51", + "Buffers": "#614D93", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Free": "#0A437C", + "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF", + "Inactive": "#584477", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "RAM_Free": "#E0F9D7", + "Slab": "#806EB7", + "Slab_Cache": "#E0752D", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Swap_Free": "#2F575E", + "Unused": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 315 + }, + "id": 206, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_vmstat_nr_dirty_background_threshold{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Dirty_background_threshold - Background writeback threshold", + "refId": "D", + "step": 240 + }, + { + "expr": "node_vmstat_nr_dirty_threshold{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Dirty_threshold - Dirty throttling threshold", + "refId": "E", + "step": 240 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Page Dirty Threshold", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Pages", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Apps": "#629E51", + "Buffers": "#614D93", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Free": "#0A437C", + "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF", + "Inactive": "#584477", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "RAM_Free": "#E0F9D7", + "Slab": "#806EB7", + "Slab_Cache": "#E0752D", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Swap_Free": "#2F575E", + "Unused": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 315 + }, + "id": 208, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_vmstat_nr_unstable{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Unstable - Pages unstable state in each zone for each NUMA node", + "refId": "D", + "step": 240 + }, + { + "expr": "node_vmstat_nr_dirtied{instance=~\"$node:$port\",job=~\"$job\"}", + "intervalFactor": 2, + "legendFormat": "Dirtied - Pages entering dirty state in each zone for each NUMA node", + "refId": "A", + "step": 240 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Page Unstable / Dirtied", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Pages", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Apps": "#629E51", + "Buffers": "#614D93", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Free": "#0A437C", + "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF", + "Inactive": "#584477", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "RAM_Free": "#E0F9D7", + "Slab": "#806EB7", + "Slab_Cache": "#E0752D", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Swap_Free": "#2F575E", + "Unused": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 325 + }, + "id": 209, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_vmstat_nr_page_table_pages{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Page_table_pages - Page table pages in each zone for each NUMA node", + "refId": "A", + "step": 240 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Page Page_table_pages", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Pages", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Apps": "#629E51", + "Buffers": "#614D93", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Free": "#0A437C", + "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF", + "Inactive": "#584477", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "RAM_Free": "#E0F9D7", + "Slab": "#806EB7", + "Slab_Cache": "#E0752D", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Swap_Free": "#2F575E", + "Unused": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 325 + }, + "id": 217, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_vmstat_nr_alloc_batch{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Alloc_batch - Pages allocated to other zones due to insufficient memory for each zone for each NUMA node", + "refId": "D", + "step": 240 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Page Alloc_batch", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Pages", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Apps": "#629E51", + "Buffers": "#614D93", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Free": "#0A437C", + "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF", + "Inactive": "#584477", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "RAM_Free": "#E0F9D7", + "Slab": "#806EB7", + "Slab_Cache": "#E0752D", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Swap_Free": "#2F575E", + "Unused": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 335 + }, + "id": 213, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_vmstat_nr_isolated_anon{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Isolated_anon - Isolated anonymous memory pages in each zone for each NUMA node", + "refId": "D", + "step": 240 + }, + { + "expr": "node_vmstat_nr_isolated_file{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Isolated_file - Isolated file memory pages in each zone for each NUMA node", + "refId": "E", + "step": 240 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Page Isolated", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Pages", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Apps": "#629E51", + "Buffers": "#614D93", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Free": "#0A437C", + "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF", + "Inactive": "#584477", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "RAM_Free": "#E0F9D7", + "Slab": "#806EB7", + "Slab_Cache": "#E0752D", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Swap_Free": "#2F575E", + "Unused": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 335 + }, + "id": 216, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_vmstat_nr_anon_pages{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Anon_pages - Anonymous mapped pagecache pages in each zone for each NUMA node", + "refId": "E", + "step": 240 + }, + { + "expr": "node_vmstat_nr_anon_transparent_hugepages{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Anon_transparent_hugepages - Anonymous transparent huge pages in each zone for each NUMA node", + "refId": "F", + "step": 240 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Page Anon", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Pages", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "Apps": "#629E51", + "Buffers": "#614D93", + "Cache": "#6D1F62", + "Cached": "#511749", + "Committed": "#508642", + "Free": "#0A437C", + "Harware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF", + "Inactive": "#584477", + "PageTables": "#0A50A1", + "Page_Tables": "#0A50A1", + "RAM_Free": "#E0F9D7", + "Slab": "#806EB7", + "Slab_Cache": "#E0752D", + "Swap": "#BF1B00", + "Swap_Cache": "#C15C17", + "Swap_Free": "#2F575E", + "Unused": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 345 + }, + "id": 204, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 350, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_vmstat_nr_free_cma{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Free_cma - Free Contiguous Memory Allocator pages in each zone for each NUMA node", + "refId": "G", + "step": 240 + }, + { + "expr": "node_vmstat_nr_vmscan_write{instance=~\"$node:$port\",job=~\"$job\"}", + "intervalFactor": 2, + "legendFormat": "Vmscan_write - Pages written by VM scanner from LRU", + "refId": "B", + "step": 240 + }, + { + "expr": "node_vmstat_nr_vmscan_immediate_reclaim{instance=~\"$node:$port\",job=~\"$job\"}", + "intervalFactor": 2, + "legendFormat": "Immediate_reclaim - Prioritise for reclaim when writeback ends in each zone for each NUMA node", + "refId": "C", + "step": 240 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Page Misc", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Pages", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + } + ], + "repeat": null, + "title": "Memory Detail Vmstat Counters", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 29 + }, + "id": 269, + "panels": [ + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 346 + }, + "id": 8, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_context_switches_total{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Context switches", + "refId": "A", + "step": 240 + }, + { + "expr": "irate(node_intr_total{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Interrupts", + "refId": "B", + "step": 240 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Context Switches / Interrupts", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Counter", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 346 + }, + "id": 7, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_load1{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 4, + "legendFormat": "Load 1m", + "refId": "A", + "step": 480 + }, + { + "expr": "node_load5{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 4, + "legendFormat": "Load 5m", + "refId": "B", + "step": 480 + }, + { + "expr": "node_load15{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 4, + "legendFormat": "Load 15m", + "refId": "C", + "step": 480 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "System Load", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Load", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 356 + }, + "id": 259, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*Critical*./", + "color": "#E24D42", + "fill": 0 + }, + { + "alias": "/.*Max*./", + "color": "#EF843C", + "fill": 0 + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_interrupts_total{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{ type }} - {{ info }}", + "refId": "A", + "step": 240 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Interrupts Detail", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Counter", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 356 + }, + "id": 64, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*Max*./", + "color": "#890F02", + "fill": 0 + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "process_max_fds{instance=~\"$node:$port\",job=~\"$job\"}", + "interval": "", + "intervalFactor": 2, + "legendFormat": "Maximum open file descriptors", + "refId": "A", + "step": 240 + }, + { + "expr": "process_open_fds{instance=~\"$node:$port\",job=~\"$job\"}", + "interval": "", + "intervalFactor": 2, + "legendFormat": "Open file descriptors", + "refId": "B", + "step": 240 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "File Descriptors", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Descriptors", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 366 + }, + "id": 151, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_entropy_available_bits{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Entropy available to random number generators", + "refId": "C", + "step": 240 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Entropy", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Entropy", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 366 + }, + "id": 62, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_procs_blocked{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Processes blocked waiting for I/O to complete", + "refId": "A", + "step": 240 + }, + { + "expr": "node_procs_running{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Processes in runnable state", + "refId": "B", + "step": 240 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Processes State", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Processes", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 376 + }, + "id": 148, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(node_forks_total{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "Processes forks second", + "refId": "C", + "step": 240 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Processes Forks", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Forks / sec", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 376 + }, + "id": 149, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "process_virtual_memory_bytes{instance=~\"$node:$port\",job=~\"$job\"}", + "interval": "", + "intervalFactor": 2, + "legendFormat": "Processes virtual memory size in bytes", + "refId": "C", + "step": 240 + }, + { + "expr": "process_resident_memory_bytes{instance=~\"$node:$port\",job=~\"$job\"}", + "interval": "", + "intervalFactor": 2, + "legendFormat": "Processes resident memory size in bytes", + "refId": "A", + "step": 240 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Processes Memory", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "decbytes", + "label": "Bytes", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 386 + }, + "id": 168, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*Variation*./", + "color": "#890F02" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_timex_sync_status{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "Is clock synchronized to a reliable server (1 = yes, 0 = no)", + "refId": "B", + "step": 240 + }, + { + "expr": "node_timex_frequency_adjustment_ratio{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "Local clock frequency adjustment", + "refId": "A", + "step": 240 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Time Syncronized Status", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Counter", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 386 + }, + "id": 260, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*Variation*./", + "color": "#890F02" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_timex_estimated_error_seconds{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "Estimated error in seconds", + "refId": "B", + "step": 240 + }, + { + "expr": "node_timex_offset_seconds{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "Time offset in between local system and reference clock", + "refId": "A", + "step": 240 + }, + { + "expr": "node_timex_maxerror_seconds{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "Maximum error in seconds", + "refId": "C", + "step": 240 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Time Syncronized Drift", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": "Seconds", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 396 + }, + "id": 158, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*Critical*./", + "color": "#E24D42", + "fill": 0 + }, + { + "alias": "/.*Max*./", + "color": "#EF843C", + "fill": 0 + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_hwmon_temp_celsius{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{ chip }} {{ sensor }} temp", + "refId": "A", + "step": 240 + }, + { + "expr": "node_hwmon_temp_crit_alarm_celsius{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "hide": true, + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{ chip }} {{ sensor }} Critical Alarm", + "refId": "B", + "step": 240 + }, + { + "expr": "node_hwmon_temp_crit_celsius{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{ chip }} {{ sensor }} Critical", + "refId": "C", + "step": 240 + }, + { + "expr": "node_hwmon_temp_crit_hyst_celsius{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "hide": true, + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{ chip }} {{ sensor }} Critical Historical", + "refId": "D", + "step": 240 + }, + { + "expr": "node_hwmon_temp_max_celsius{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "hide": true, + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{ chip }} {{ sensor }} Max", + "refId": "E", + "step": 240 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Hardware temperature monitor", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "celsius", + "label": "Temperature", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + } + ], + "repeat": null, + "title": "System Detail", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 30 + }, + "id": 270, + "panels": [ + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 397 + }, + "id": 9, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideZero": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "seriesOverrides": [ + { + "alias": "/.*Read.*/", + "transform": "negative-Y" + }, + { + "alias": "/.*sda_.*/", + "color": "#7EB26D" + }, + { + "alias": "/.*sdb_.*/", + "color": "#EAB839" + }, + { + "alias": "/.*sdc_.*/", + "color": "#6ED0E0" + }, + { + "alias": "/.*sdd_.*/", + "color": "#EF843C" + }, + { + "alias": "/.*sde_.*/", + "color": "#E24D42" + }, + { + "alias": "/.*sda1.*/", + "color": "#584477" + }, + { + "alias": "/.*sda2_.*/", + "color": "#BA43A9" + }, + { + "alias": "/.*sda3_.*/", + "color": "#F4D598" + }, + { + "alias": "/.*sdb1.*/", + "color": "#0A50A1" + }, + { + "alias": "/.*sdb2.*/", + "color": "#BF1B00" + }, + { + "alias": "/.*sdb3.*/", + "color": "#E0752D" + }, + { + "alias": "/.*sdc1.*/", + "color": "#962D82" + }, + { + "alias": "/.*sdc2.*/", + "color": "#614D93" + }, + { + "alias": "/.*sdc3.*/", + "color": "#9AC48A" + }, + { + "alias": "/.*sdd1.*/", + "color": "#65C5DB" + }, + { + "alias": "/.*sdd2.*/", + "color": "#F9934E" + }, + { + "alias": "/.*sdd3.*/", + "color": "#EA6460" + }, + { + "alias": "/.*sde1.*/", + "color": "#E0F9D7" + }, + { + "alias": "/.*sdd2.*/", + "color": "#FCEACA" + }, + { + "alias": "/.*sde3.*/", + "color": "#F9E2D2" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_disk_reads_completed_total{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "intervalFactor": 4, + "legendFormat": "{{device}} - Reads completed", + "refId": "A", + "step": 8 + }, + { + "expr": "irate(node_disk_writes_completed_total{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "intervalFactor": 2, + "legendFormat": "{{device}} - Writes completed", + "refId": "B", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Disk IOps Completed", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "iops", + "label": "IO read (-) / write (+)", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 397 + }, + "id": 33, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideZero": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*Read.*/", + "transform": "negative-Y" + }, + { + "alias": "/.*sda_.*/", + "color": "#7EB26D" + }, + { + "alias": "/.*sdb_.*/", + "color": "#EAB839" + }, + { + "alias": "/.*sdc_.*/", + "color": "#6ED0E0" + }, + { + "alias": "/.*sdd_.*/", + "color": "#EF843C" + }, + { + "alias": "/.*sde_.*/", + "color": "#E24D42" + }, + { + "alias": "/.*sda1.*/", + "color": "#584477" + }, + { + "alias": "/.*sda2_.*/", + "color": "#BA43A9" + }, + { + "alias": "/.*sda3_.*/", + "color": "#F4D598" + }, + { + "alias": "/.*sdb1.*/", + "color": "#0A50A1" + }, + { + "alias": "/.*sdb2.*/", + "color": "#BF1B00" + }, + { + "alias": "/.*sdb3.*/", + "color": "#E0752D" + }, + { + "alias": "/.*sdc1.*/", + "color": "#962D82" + }, + { + "alias": "/.*sdc2.*/", + "color": "#614D93" + }, + { + "alias": "/.*sdc3.*/", + "color": "#9AC48A" + }, + { + "alias": "/.*sdd1.*/", + "color": "#65C5DB" + }, + { + "alias": "/.*sdd2.*/", + "color": "#F9934E" + }, + { + "alias": "/.*sdd3.*/", + "color": "#EA6460" + }, + { + "alias": "/.*sde1.*/", + "color": "#E0F9D7" + }, + { + "alias": "/.*sdd2.*/", + "color": "#FCEACA" + }, + { + "alias": "/.*sde3.*/", + "color": "#F9E2D2" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_disk_read_bytes_total{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 4, + "legendFormat": "{{device}} - Read bytes", + "refId": "A", + "step": 8 + }, + { + "expr": "irate(node_disk_written_bytes_total{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{device}} - Written bytes", + "refId": "B", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Disk R/W Data", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "Bps", + "label": "Bytes read (-) / write (+)", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "", + "fill": 3, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 407 + }, + "id": 37, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideZero": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*Read.*/", + "transform": "negative-Y" + }, + { + "alias": "/.*sda_.*/", + "color": "#7EB26D" + }, + { + "alias": "/.*sdb_.*/", + "color": "#EAB839" + }, + { + "alias": "/.*sdc_.*/", + "color": "#6ED0E0" + }, + { + "alias": "/.*sdd_.*/", + "color": "#EF843C" + }, + { + "alias": "/.*sde_.*/", + "color": "#E24D42" + }, + { + "alias": "/.*sda1.*/", + "color": "#584477" + }, + { + "alias": "/.*sda2_.*/", + "color": "#BA43A9" + }, + { + "alias": "/.*sda3_.*/", + "color": "#F4D598" + }, + { + "alias": "/.*sdb1.*/", + "color": "#0A50A1" + }, + { + "alias": "/.*sdb2.*/", + "color": "#BF1B00" + }, + { + "alias": "/.*sdb3.*/", + "color": "#E0752D" + }, + { + "alias": "/.*sdc1.*/", + "color": "#962D82" + }, + { + "alias": "/.*sdc2.*/", + "color": "#614D93" + }, + { + "alias": "/.*sdc3.*/", + "color": "#9AC48A" + }, + { + "alias": "/.*sdd1.*/", + "color": "#65C5DB" + }, + { + "alias": "/.*sdd2.*/", + "color": "#F9934E" + }, + { + "alias": "/.*sdd3.*/", + "color": "#EA6460" + }, + { + "alias": "/.*sde1.*/", + "color": "#E0F9D7" + }, + { + "alias": "/.*sdd2.*/", + "color": "#FCEACA" + }, + { + "alias": "/.*sde3.*/", + "color": "#F9E2D2" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_disk_read_time_seconds_total{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "hide": false, + "intervalFactor": 4, + "legendFormat": "{{device}} - Read time ms", + "refId": "A", + "step": 8 + }, + { + "expr": "irate(node_disk_write_time_seconds_total{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "hide": false, + "intervalFactor": 2, + "legendFormat": "{{device}} - Write time ms", + "refId": "B", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Disk R/W Time", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "ms", + "label": "Millisec. read (-) / write (+)", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 407 + }, + "id": 35, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideZero": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*sda_.*/", + "color": "#7EB26D" + }, + { + "alias": "/.*sdb_.*/", + "color": "#EAB839" + }, + { + "alias": "/.*sdc_.*/", + "color": "#6ED0E0" + }, + { + "alias": "/.*sdd_.*/", + "color": "#EF843C" + }, + { + "alias": "/.*sde_.*/", + "color": "#E24D42" + }, + { + "alias": "/.*sda1.*/", + "color": "#584477" + }, + { + "alias": "/.*sda2_.*/", + "color": "#BA43A9" + }, + { + "alias": "/.*sda3_.*/", + "color": "#F4D598" + }, + { + "alias": "/.*sdb1.*/", + "color": "#0A50A1" + }, + { + "alias": "/.*sdb2.*/", + "color": "#BF1B00" + }, + { + "alias": "/.*sdb3.*/", + "color": "#E0752D" + }, + { + "alias": "/.*sdc1.*/", + "color": "#962D82" + }, + { + "alias": "/.*sdc2.*/", + "color": "#614D93" + }, + { + "alias": "/.*sdc3.*/", + "color": "#9AC48A" + }, + { + "alias": "/.*sdd1.*/", + "color": "#65C5DB" + }, + { + "alias": "/.*sdd2.*/", + "color": "#F9934E" + }, + { + "alias": "/.*sdd3.*/", + "color": "#EA6460" + }, + { + "alias": "/.*sde1.*/", + "color": "#E0F9D7" + }, + { + "alias": "/.*sdd2.*/", + "color": "#FCEACA" + }, + { + "alias": "/.*sde3.*/", + "color": "#F9E2D2" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_disk_io_time_weighted_seconds_total{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "intervalFactor": 4, + "legendFormat": "{{device}} - IO time weighted", + "refId": "A", + "step": 8 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Disk IOs Weighted", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "ms", + "label": "Milliseconds", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 417 + }, + "id": 133, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideZero": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*Read.*/", + "transform": "negative-Y" + }, + { + "alias": "/.*sda_.*/", + "color": "#7EB26D" + }, + { + "alias": "/.*sdb_.*/", + "color": "#EAB839" + }, + { + "alias": "/.*sdc_.*/", + "color": "#6ED0E0" + }, + { + "alias": "/.*sdd_.*/", + "color": "#EF843C" + }, + { + "alias": "/.*sde_.*/", + "color": "#E24D42" + }, + { + "alias": "/.*sda1.*/", + "color": "#584477" + }, + { + "alias": "/.*sda2_.*/", + "color": "#BA43A9" + }, + { + "alias": "/.*sda3_.*/", + "color": "#F4D598" + }, + { + "alias": "/.*sdb1.*/", + "color": "#0A50A1" + }, + { + "alias": "/.*sdb2.*/", + "color": "#BF1B00" + }, + { + "alias": "/.*sdb3.*/", + "color": "#E0752D" + }, + { + "alias": "/.*sdc1.*/", + "color": "#962D82" + }, + { + "alias": "/.*sdc2.*/", + "color": "#614D93" + }, + { + "alias": "/.*sdc3.*/", + "color": "#9AC48A" + }, + { + "alias": "/.*sdd1.*/", + "color": "#65C5DB" + }, + { + "alias": "/.*sdd2.*/", + "color": "#F9934E" + }, + { + "alias": "/.*sdd3.*/", + "color": "#EA6460" + }, + { + "alias": "/.*sde1.*/", + "color": "#E0F9D7" + }, + { + "alias": "/.*sdd2.*/", + "color": "#FCEACA" + }, + { + "alias": "/.*sde3.*/", + "color": "#F9E2D2" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_disk_reads_merged_total{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "intervalFactor": 2, + "legendFormat": "{{device}} - Read merged", + "refId": "C", + "step": 4 + }, + { + "expr": "irate(node_disk_writes_merged_total{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "intervalFactor": 2, + "legendFormat": "{{device}} - Write merged", + "refId": "D", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Disk R/W Merged", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "iops", + "label": "I/Os", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "", + "fill": 3, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 417 + }, + "id": 36, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideZero": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*sda_.*/", + "color": "#7EB26D" + }, + { + "alias": "/.*sdb_.*/", + "color": "#EAB839" + }, + { + "alias": "/.*sdc_.*/", + "color": "#6ED0E0" + }, + { + "alias": "/.*sdd_.*/", + "color": "#EF843C" + }, + { + "alias": "/.*sde_.*/", + "color": "#E24D42" + }, + { + "alias": "/.*sda1.*/", + "color": "#584477" + }, + { + "alias": "/.*sda2_.*/", + "color": "#BA43A9" + }, + { + "alias": "/.*sda3_.*/", + "color": "#F4D598" + }, + { + "alias": "/.*sdb1.*/", + "color": "#0A50A1" + }, + { + "alias": "/.*sdb2.*/", + "color": "#BF1B00" + }, + { + "alias": "/.*sdb3.*/", + "color": "#E0752D" + }, + { + "alias": "/.*sdc1.*/", + "color": "#962D82" + }, + { + "alias": "/.*sdc2.*/", + "color": "#614D93" + }, + { + "alias": "/.*sdc3.*/", + "color": "#9AC48A" + }, + { + "alias": "/.*sdd1.*/", + "color": "#65C5DB" + }, + { + "alias": "/.*sdd2.*/", + "color": "#F9934E" + }, + { + "alias": "/.*sdd3.*/", + "color": "#EA6460" + }, + { + "alias": "/.*sde1.*/", + "color": "#E0F9D7" + }, + { + "alias": "/.*sdd2.*/", + "color": "#FCEACA" + }, + { + "alias": "/.*sde3.*/", + "color": "#F9E2D2" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_disk_io_time_seconds_total{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "intervalFactor": 4, + "legendFormat": "{{device}} - IO time ms", + "refId": "A", + "step": 8 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Milliseconds Spent Doing I/Os", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "ms", + "label": "Milliseconds", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 427 + }, + "id": 34, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideZero": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*sda_.*/", + "color": "#7EB26D" + }, + { + "alias": "/.*sdb_.*/", + "color": "#EAB839" + }, + { + "alias": "/.*sdc_.*/", + "color": "#6ED0E0" + }, + { + "alias": "/.*sdd_.*/", + "color": "#EF843C" + }, + { + "alias": "/.*sde_.*/", + "color": "#E24D42" + }, + { + "alias": "/.*sda1.*/", + "color": "#584477" + }, + { + "alias": "/.*sda2_.*/", + "color": "#BA43A9" + }, + { + "alias": "/.*sda3_.*/", + "color": "#F4D598" + }, + { + "alias": "/.*sdb1.*/", + "color": "#0A50A1" + }, + { + "alias": "/.*sdb2.*/", + "color": "#BF1B00" + }, + { + "alias": "/.*sdb3.*/", + "color": "#E0752D" + }, + { + "alias": "/.*sdc1.*/", + "color": "#962D82" + }, + { + "alias": "/.*sdc2.*/", + "color": "#614D93" + }, + { + "alias": "/.*sdc3.*/", + "color": "#9AC48A" + }, + { + "alias": "/.*sdd1.*/", + "color": "#65C5DB" + }, + { + "alias": "/.*sdd2.*/", + "color": "#F9934E" + }, + { + "alias": "/.*sdd3.*/", + "color": "#EA6460" + }, + { + "alias": "/.*sde1.*/", + "color": "#E0F9D7" + }, + { + "alias": "/.*sdd2.*/", + "color": "#FCEACA" + }, + { + "alias": "/.*sde3.*/", + "color": "#F9E2D2" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_disk_io_now{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "intervalFactor": 4, + "legendFormat": "{{device}} - IO now", + "refId": "A", + "step": 8 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Disk IOs Current in Progress", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "iops", + "label": "I/Os", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 427 + }, + "id": 66, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideZero": false, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*sda_.*/", + "color": "#7EB26D" + }, + { + "alias": "/.*sdb_.*/", + "color": "#EAB839" + }, + { + "alias": "/.*sdc_.*/", + "color": "#6ED0E0" + }, + { + "alias": "/.*sdd_.*/", + "color": "#EF843C" + }, + { + "alias": "/.*sde_.*/", + "color": "#E24D42" + }, + { + "alias": "/.*sda1.*/", + "color": "#584477" + }, + { + "alias": "/.*sda2_.*/", + "color": "#B7DBAB" + }, + { + "alias": "/.*sda3_.*/", + "color": "#F4D598" + }, + { + "alias": "/.*sdb1.*/", + "color": "#0A50A1" + }, + { + "alias": "/.*sdb2.*/", + "color": "#BF1B00" + }, + { + "alias": "/.*sdb3.*/", + "color": "#E0752D" + }, + { + "alias": "/.*sdc1.*/", + "color": "#962D82" + }, + { + "alias": "/.*sdc2.*/", + "color": "#614D93" + }, + { + "alias": "/.*sdc3.*/", + "color": "#9AC48A" + }, + { + "alias": "/.*sdd1.*/", + "color": "#65C5DB" + }, + { + "alias": "/.*sdd2.*/", + "color": "#F9934E" + }, + { + "alias": "/.*sdd3.*/", + "color": "#EA6460" + }, + { + "alias": "/.*sde1.*/", + "color": "#E0F9D7" + }, + { + "alias": "/.*sdd2.*/", + "color": "#FCEACA" + }, + { + "alias": "/.*sde3.*/", + "color": "#F9E2D2" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_textfile_scrape_error{instance=~\"$node:$port\",job=~\"$job\"}", + "intervalFactor": 4, + "legendFormat": "Textfile scrape error (1 = true)", + "refId": "A", + "step": 8 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Open Error File", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Errors", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + } + ], + "repeat": null, + "title": "Disk Detail", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 31 + }, + "id": 271, + "panels": [ + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 3, + "description": "", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 428 + }, + "id": 43, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_filesystem_avail_bytes{instance=~\"$node:$port\",job=~\"$job\",device!~'rootfs'}", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "{{mountpoint}} - Available", + "metric": "", + "refId": "A", + "step": 4 + }, + { + "expr": "node_filesystem_free_bytes{instance=~\"$node:$port\",job=~\"$job\",device!~'rootfs'}", + "format": "time_series", + "hide": true, + "intervalFactor": 2, + "legendFormat": "{{mountpoint}} - Free", + "refId": "B", + "step": 2 + }, + { + "expr": "node_filesystem_size_bytes{instance=~\"$node:$port\",job=~\"$job\",device!~'rootfs'}", + "format": "time_series", + "hide": true, + "intervalFactor": 2, + "legendFormat": "{{mountpoint}} - Size", + "refId": "D", + "step": 2 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Filesystem space available", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "label": "Bytes", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 428 + }, + "id": 41, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideZero": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_filesystem_files_free{instance=~\"$node:$port\",job=~\"$job\",device!~'rootfs'}", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "{{mountpoint}} - Free file nodes", + "refId": "B", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "File Nodes Free", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "File Nodes", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 438 + }, + "id": 28, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_filefd_maximum{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 4, + "legendFormat": "Max open files", + "refId": "A", + "step": 8 + }, + { + "expr": "node_filefd_allocated{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Open files", + "refId": "B", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "File Descriptor", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Files", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 438 + }, + "id": 219, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideZero": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_filesystem_files{instance=~\"$node:$port\",job=~\"$job\",device!~'rootfs'}", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "{{mountpoint}} - File nodes total", + "refId": "A", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "File Nodes Size", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "File Nodes", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": { + "/ ReadOnly": "#890F02" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": null, + "description": "", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 448 + }, + "id": 44, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": true, + "hideZero": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 4, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "node_filesystem_readonly{instance=~\"$node:$port\",job=~\"$job\",device!~'rootfs'}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{mountpoint}} - ReadOnly", + "refId": "C", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Filesystem in ReadOnly", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Read Only", + "logBase": 1, + "max": "1", + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + } + ], + "repeat": null, + "title": "Filesystem Detail", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 32 + }, + "id": 272, + "panels": [ + { + "aliasColors": { + "receive_packets_eth0": "#7EB26D", + "receive_packets_lo": "#E24D42", + "transmit_packets_eth0": "#7EB26D", + "transmit_packets_lo": "#E24D42" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 449 + }, + "id": 60, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 300, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*Trans.*/", + "transform": "negative-Y" + }, + { + "alias": "/.*lo.*/", + "color": "#7EB26D" + }, + { + "alias": "/.*eth0.*/", + "color": "#EAB839" + }, + { + "alias": "/.*eth1.*/", + "color": "#6ED0E0" + }, + { + "alias": "/.*eth2.*/", + "color": "#EF843C" + }, + { + "alias": "/.*eth3.*/", + "color": "#E24D42" + }, + { + "alias": "/.*eth4.*/", + "color": "#1F78C1" + }, + { + "alias": "/.*eth5.*/", + "color": "#BA43A9" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_network_receive_packets_total{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{device}} - Receive", + "refId": "O", + "step": 4 + }, + { + "expr": "irate(node_network_transmit_packets_total{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{device}} - Transmit", + "refId": "P", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Network Traffic by Packets", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "pps", + "label": "Packets out (-) / in (+)", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 449 + }, + "id": 142, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 300, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*Trans.*/", + "transform": "negative-Y" + }, + { + "alias": "/.*lo.*.errors.*/", + "color": "#7EB26D" + }, + { + "alias": "/.*eth0.*.errors.*/", + "color": "#EAB839" + }, + { + "alias": "/.*eth1.*.errors.*/", + "color": "#6ED0E0" + }, + { + "alias": "/.*eth2.*.errors.*/", + "color": "#EF843C" + }, + { + "alias": "/.*eth3.*.errors.*/", + "color": "#E24D42" + }, + { + "alias": "/.*eth4.*.errors.*/", + "color": "#1F78C1" + }, + { + "alias": "/.*eth5.*.errors.*/", + "color": "#BA43A9" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_network_receive_errs_total{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{device}} - Receive errors", + "refId": "E", + "step": 4 + }, + { + "expr": "irate(node_network_transmit_errs_total{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{device}} - Rransmit errors", + "refId": "F", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Network Traffic Errors", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "pps", + "label": "Packets out (-) / in (+)", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 459 + }, + "id": 143, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 300, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*Trans.*/", + "transform": "negative-Y" + }, + { + "alias": "/.*lo.*.drop.*/", + "color": "#7EB26D" + }, + { + "alias": "/.*eth0.*.drop.*/", + "color": "#EAB839" + }, + { + "alias": "/.*eth1.*.drop.*/", + "color": "#6ED0E0" + }, + { + "alias": "/.*eth2.*.drop.*/", + "color": "#EF843C" + }, + { + "alias": "/.*eth3.*.drop.*/", + "color": "#E24D42" + }, + { + "alias": "/.*eth4.*.drop.*/", + "color": "#1F78C1" + }, + { + "alias": "/.*eth5.*.drop.*/", + "color": "#BA43A9" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_network_receive_drop_total{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{device}} - Receive drop", + "refId": "G", + "step": 4 + }, + { + "expr": "irate(node_network_transmit_drop_total{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{device}} - Transmit drop", + "refId": "H", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Network Traffic Drop", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "pps", + "label": "Packets out (-) / in (+)", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 459 + }, + "id": 141, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 300, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*Trans.*/", + "transform": "negative-Y" + }, + { + "alias": "/.*lo.*.compressed.*/", + "color": "#7EB26D" + }, + { + "alias": "/.*eth0.*.compressed.*/", + "color": "#EAB839" + }, + { + "alias": "/.*eth1.*.compressed.*/", + "color": "#6ED0E0" + }, + { + "alias": "/.*eth2.*.compressed.*/", + "color": "#EF843C" + }, + { + "alias": "/.*eth3.*.compressed.*/", + "color": "#E24D42" + }, + { + "alias": "/.*eth4.*.compressed.*/", + "color": "#1F78C1" + }, + { + "alias": "/.*eth5.*.compressed.*/", + "color": "#BA43A9" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_network_receive_compressed_total{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{device}} - Receive compressed", + "refId": "C", + "step": 4 + }, + { + "expr": "irate(node_network_transmit_compressed_total{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{device}} - Transmit compressed", + "refId": "D", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Network Traffic Compressed", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "pps", + "label": "Packets out (-) / in (+)", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 469 + }, + "id": 146, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 300, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*Trans.*/", + "transform": "negative-Y" + }, + { + "alias": "/.*lo.*.multicast.*/", + "color": "#7EB26D" + }, + { + "alias": "/.*eth0.*.multicast.*/", + "color": "#EAB839" + }, + { + "alias": "/.*eth1.*.multicast.*/", + "color": "#6ED0E0" + }, + { + "alias": "/.*eth2.*.multicast.*/", + "color": "#EF843C" + }, + { + "alias": "/.*eth3.*.multicast.*/", + "color": "#E24D42" + }, + { + "alias": "/.*eth4.*.multicast.*/", + "color": "#1F78C1" + }, + { + "alias": "/.*eth5.*.multicast.*/", + "color": "#BA43A9" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_network_receive_multicast_total{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{device}} - Receive multicast", + "refId": "M", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Network Traffic Multicast", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "pps", + "label": "Packets out (-) / in (+)", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 469 + }, + "id": 144, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 300, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*Trans.*/", + "transform": "negative-Y" + }, + { + "alias": "/.*lo.*.fifo.*/", + "color": "#7EB26D" + }, + { + "alias": "/.*eth0.*.fifo.*/", + "color": "#EAB839" + }, + { + "alias": "/.*eth1.*.fifo.*/", + "color": "#6ED0E0" + }, + { + "alias": "/.*eth2.*.fifo.*/", + "color": "#EF843C" + }, + { + "alias": "/.*eth3.*.fifo.*/", + "color": "#E24D42" + }, + { + "alias": "/.*eth4.*.fifo.*/", + "color": "#1F78C1" + }, + { + "alias": "/.*eth5.*.fifo.*/", + "color": "#BA43A9" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_network_receive_fifo_total{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{device}} - Receive fifo", + "refId": "I", + "step": 4 + }, + { + "expr": "irate(node_network_transmit_fifo_total{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{device}} - Transmit fifo", + "refId": "J", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Network Traffic Fifo", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "pps", + "label": "Packets out (-) / in (+)", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 479 + }, + "id": 145, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 300, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*Trans.*/", + "transform": "negative-Y" + }, + { + "alias": "/.*lo.*.frame.*/", + "color": "#7EB26D" + }, + { + "alias": "/.*eth0.*.frame.*/", + "color": "#EAB839" + }, + { + "alias": "/.*eth1.*.frame.*/", + "color": "#6ED0E0" + }, + { + "alias": "/.*eth2.*.frame.*/", + "color": "#EF843C" + }, + { + "alias": "/.*eth3.*.frame.*/", + "color": "#E24D42" + }, + { + "alias": "/.*eth4.*.frame.*/", + "color": "#1F78C1" + }, + { + "alias": "/.*eth5.*.frame.*/", + "color": "#BA43A9" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_network_receive_frame_total{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "{{device}} - Receive frame", + "refId": "K", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Network Traffic Frame", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "pps", + "label": "Packets out (-) / in (+)", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 479 + }, + "id": 231, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 300, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*Trans.*/", + "transform": "negative-Y" + }, + { + "alias": "/.*lo.*.carrier.*/", + "color": "#7EB26D" + }, + { + "alias": "/.*eth0.*.carrier.*/", + "color": "#EAB839" + }, + { + "alias": "/.*eth1.*.carrier.*/", + "color": "#6ED0E0" + }, + { + "alias": "/.*eth2.*.carrier.*/", + "color": "#EF843C" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_network_transmit_carrier_total{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{device}} - Statistic transmit_carrier", + "refId": "C", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Network Traffic Carrier", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Counter", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 489 + }, + "id": 232, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 300, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*Trans.*/", + "transform": "negative-Y" + }, + { + "alias": "/.*lo.*.carrier.*/", + "color": "#7EB26D" + }, + { + "alias": "/.*eth0.*.carrier.*/", + "color": "#EAB839" + }, + { + "alias": "/.*eth1.*.carrier.*/", + "color": "#6ED0E0" + }, + { + "alias": "/.*eth2.*.carrier.*/", + "color": "#EF843C" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_network_transmit_colls_total{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{device}} - Transmit colls", + "refId": "C", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Network Traffic Colls", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Counter", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 489 + }, + "id": 61, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "NF conntrack limit", + "color": "#890F02", + "fill": 0 + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_nf_conntrack_entries{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "NF conntrack entries", + "refId": "O", + "step": 4 + }, + { + "expr": "node_nf_conntrack_entries_limit{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "NF conntrack limit", + "refId": "P", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "NF Contrack", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Entries", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 499 + }, + "id": 230, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_arp_entries{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{ device }} - ARP entries", + "refId": "O", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "ARP Entries", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Entries", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + } + ], + "repeat": null, + "title": "Network Traffic Detail", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 33 + }, + "id": 273, + "panels": [ + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 500 + }, + "id": 63, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 300, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_sockstat_TCP_alloc{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "TCP_alloc - Allocated sockets", + "refId": "D", + "step": 240 + }, + { + "expr": "node_sockstat_TCP_inuse{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "TCP_inuse - Tcp sockets currently in use", + "refId": "E", + "step": 240 + }, + { + "expr": "node_sockstat_TCP_mem{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "TCP_mem - Used memory for tcp", + "refId": "F", + "step": 240 + }, + { + "expr": "node_sockstat_TCP_orphan{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "TCP_orphan - Orphan sockets", + "refId": "H", + "step": 240 + }, + { + "expr": "node_sockstat_TCP_tw{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "TCP_tw - Sockets wating close", + "refId": "I", + "step": 240 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Sockstat TCP", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Sockets", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 500 + }, + "id": 124, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 300, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_sockstat_UDPLITE_inuse{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "UDPLITE_inuse - Udplite sockets currently in use", + "refId": "J", + "step": 240 + }, + { + "expr": "node_sockstat_UDP_inuse{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "UDP_inuse - Udp sockets currently in use", + "refId": "K", + "step": 240 + }, + { + "expr": "node_sockstat_UDP_mem{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "UDP_mem - Used memory for udp", + "refId": "L", + "step": 240 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Sockstat UDP", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Sockets", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 510 + }, + "id": 126, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 300, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_sockstat_sockets_used{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Sockets_used - Sockets currently in use", + "refId": "N", + "step": 240 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Sockstat Used", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Sockets", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 510 + }, + "id": 220, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 300, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_sockstat_TCP_mem_bytes{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "TCP_mem_bytes - ", + "refId": "G", + "step": 240 + }, + { + "expr": "node_sockstat_UDP_mem_bytes{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "UDP_mem_bytes - ", + "refId": "A", + "step": 240 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Sockstat Memory Size", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "label": "Bytes", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 520 + }, + "id": 125, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 300, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_sockstat_FRAG_inuse{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "FRAG_inuse - Frag sockets currently in use", + "refId": "A", + "step": 240 + }, + { + "expr": "node_sockstat_FRAG_memory{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "FRAG_memory - Used memory for frag", + "refId": "B", + "step": 240 + }, + { + "expr": "node_sockstat_RAW_inuse{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "RAW_inuse - Raw sockets currently in use", + "refId": "C", + "step": 240 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Sockstat FRAG / RAW", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Sockets", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + } + ], + "repeat": null, + "title": "Network Sockstat", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 34 + }, + "id": 274, + "panels": [ + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 521 + }, + "height": "", + "id": 49, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 300, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": null, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*Out.*/", + "transform": "negative-Y" + }, + { + "alias": "/.*Discards.*/", + "color": "#7EB26D" + }, + { + "alias": "/.*NoRoutes.*/", + "color": "#EAB839" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_Ip_InReceives{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "InReceives - IP inreceives", + "refId": "A", + "step": 4 + }, + { + "expr": "irate(node_netstat_Ip_DefaultTTL{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": true, + "intervalFactor": 2, + "legendFormat": "DefaultTTL - Default TTL", + "refId": "B", + "step": 10 + }, + { + "expr": "irate(node_netstat_Ip_InDelivers{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "InDelivers - IP indelivers", + "refId": "I", + "step": 4 + }, + { + "expr": "irate(node_netstat_Ip_OutRequests{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "OutRequests - IP outrequests", + "refId": "P", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Netstat IP In / Out", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Datagrams out (-) / in (+)", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 521 + }, + "height": "", + "id": 221, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 300, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 2, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*Out.*/", + "transform": "negative-Y" + }, + { + "alias": "/.*Octets.*/", + "color": "#7EB26D" + }, + { + "alias": "/.*McastPkts.*/", + "color": "#EAB839" + }, + { + "alias": "/.*McastOctets.*/", + "color": "#6ED0E0" + }, + { + "alias": "/.*BcastPkts.*/", + "color": "#EF843C" + }, + { + "alias": "/.*BcastOctets.*/", + "color": "#E24D42" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_IpExt_InOctets{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "InOctets - Received octets", + "refId": "K", + "step": 4 + }, + { + "expr": "irate(node_netstat_IpExt_OutOctets{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "OutOctets - Sent octets", + "refId": "Q", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Netstat IP In / Out Octets", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Octects out (-) / in (+)", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 531 + }, + "height": "", + "id": 119, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 300, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 2, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*Out.*/", + "transform": "negative-Y" + }, + { + "alias": "/.*Octets.*/", + "color": "#7EB26D" + }, + { + "alias": "/.*McastPkts.*/", + "color": "#EAB839" + }, + { + "alias": "/.*McastOctets.*/", + "color": "#6ED0E0" + }, + { + "alias": "/.*BcastPkts.*/", + "color": "#EF843C" + }, + { + "alias": "/.*BcastOctets.*/", + "color": "#E24D42" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_IpExt_InBcastPkts{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "InBcastPkts - Received IP broadcast datagrams", + "refId": "B", + "step": 4 + }, + { + "expr": "irate(node_netstat_IpExt_OutBcastPkts{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "OutBcastPkts - Sent IP broadcast datagrams", + "refId": "N", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Netstat IP Bcast", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Datagrams out (-) / in (+)", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 531 + }, + "height": "", + "id": 222, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 300, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 2, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*Out.*/", + "transform": "negative-Y" + }, + { + "alias": "/.*Octets.*/", + "color": "#7EB26D" + }, + { + "alias": "/.*McastPkts.*/", + "color": "#EAB839" + }, + { + "alias": "/.*McastOctets.*/", + "color": "#6ED0E0" + }, + { + "alias": "/.*BcastPkts.*/", + "color": "#EF843C" + }, + { + "alias": "/.*BcastOctets.*/", + "color": "#E24D42" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_IpExt_InBcastOctets{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "InBcastOctets - Received IP broadcast octets", + "refId": "A", + "step": 4 + }, + { + "expr": "irate(node_netstat_IpExt_OutBcastOctets{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "OutBcastOctets - Sent IP broadcast octects", + "refId": "M", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Netstat IP Bcast Octets", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Octets out (-) / in (+)", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 541 + }, + "height": "", + "id": 120, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 300, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 2, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*Out.*/", + "transform": "negative-Y" + }, + { + "alias": "/.*Octets.*/", + "color": "#7EB26D" + }, + { + "alias": "/.*McastPkts.*/", + "color": "#EAB839" + }, + { + "alias": "/.*McastOctets.*/", + "color": "#6ED0E0" + }, + { + "alias": "/.*BcastPkts.*/", + "color": "#EF843C" + }, + { + "alias": "/.*BcastOctets.*/", + "color": "#E24D42" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_IpExt_InMcastPkts{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "InMcastPkts - Received IP multicast datagrams", + "refId": "H", + "step": 4 + }, + { + "expr": "irate(node_netstat_IpExt_OutMcastPkts{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "OutMcastPkts - Sent IP multicast datagrams", + "refId": "P", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Netstat IP Mcast", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Datagrams out (-) / in (+)", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 541 + }, + "height": "", + "id": 223, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 300, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 2, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*Out.*/", + "transform": "negative-Y" + }, + { + "alias": "/.*Octets.*/", + "color": "#7EB26D" + }, + { + "alias": "/.*McastPkts.*/", + "color": "#EAB839" + }, + { + "alias": "/.*McastOctets.*/", + "color": "#6ED0E0" + }, + { + "alias": "/.*BcastPkts.*/", + "color": "#EF843C" + }, + { + "alias": "/.*BcastOctets.*/", + "color": "#E24D42" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_IpExt_InMcastOctets{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "InMcastOctets - Received IP multicast octets", + "refId": "G", + "step": 4 + }, + { + "expr": "irate(node_netstat_IpExt_OutMcastOctets{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "OutMcastOctets - Sent IP multicast octets", + "refId": "O", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Netstat IP Mcast Octets", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Octets out (-) / in (+)", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 551 + }, + "height": "", + "id": 81, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 300, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": null, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_Ip_ForwDatagrams{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "ForwDatagrams - IP outforwdatagrams", + "refId": "C", + "step": 4 + }, + { + "expr": "irate(node_netstat_Ip_Forwarding{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Forwarding - IP forwarding", + "refId": "D", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Netstat IP Forwarding", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Datagrams", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 551 + }, + "height": "", + "id": 122, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 300, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": null, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_Ip_FragCreates{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "FragCreates - IP fragmentation creations", + "refId": "E", + "step": 4 + }, + { + "expr": "irate(node_netstat_Ip_FragFails{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "FragFails - IP fragmentation failures", + "refId": "F", + "step": 4 + }, + { + "expr": "irate(node_netstat_Ip_FragOKs{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "FragOKs - IP fragmentation oks", + "refId": "G", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Netstat IP Fragmented", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Datagrams", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 561 + }, + "height": "", + "id": 51, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 300, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 2, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_IpExt_InCEPkts{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "InCEPkts - Congestion Experimented datagrams in", + "refId": "C", + "step": 4 + }, + { + "expr": "irate(node_netstat_IpExt_InECT0Pkts{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "InECT0Pkts - Datagrams received with ECT(0)", + "refId": "E", + "step": 4 + }, + { + "expr": "irate(node_netstat_IpExt_InECT1Pkts{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "InECT1Pkt - Datarams received with ECT(1)", + "refId": "F", + "step": 4 + }, + { + "expr": "irate(node_netstat_IpExt_InNoECTPkts{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "InNoECTPkts - Datagrams received with NOECT", + "refId": "A", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Netstat IP ECT / CEP", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Datagrams", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 561 + }, + "height": "", + "id": 123, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 300, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": null, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_Ip_ReasmFails{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "ReasmFails - IP reassembly failures", + "refId": "Q", + "step": 4 + }, + { + "expr": "irate(node_netstat_Ip_ReasmOKs{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "ReasmOKs - IP reassembly oks", + "refId": "R", + "step": 4 + }, + { + "expr": "irate(node_netstat_Ip_ReasmReqds{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "ReasmReqds - IP reassembly requireds", + "refId": "S", + "step": 4 + }, + { + "expr": "irate(node_netstat_Ip_ReasmTimeout{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "ReasmTimeout - IP reasmtimeout", + "refId": "T", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Netstat IP Reasambled", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Datagrams", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 571 + }, + "height": "", + "id": 118, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sideWidth": 300, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": null, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*Out.*/", + "transform": "negative-Y" + }, + { + "alias": "/.*Discards.*/", + "color": "#7EB26D" + }, + { + "alias": "/.*NoRoutes.*/", + "color": "#EAB839" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_Ip_InDiscards{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "InDiscards - IP indiscards", + "refId": "J", + "step": 4 + }, + { + "expr": "irate(node_netstat_Ip_InHdrErrors{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "InHdrErrors - IP inhdrerrors", + "refId": "K", + "step": 4 + }, + { + "expr": "irate(node_netstat_Ip_InUnknownProtos{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "InUnknownProtos - IP inunknownprotos", + "refId": "M", + "step": 4 + }, + { + "expr": "irate(node_netstat_Ip_OutDiscards{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "OutDiscards - IP outdiscards", + "refId": "N", + "step": 4 + }, + { + "expr": "irate(node_netstat_Ip_OutNoRoutes{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "OutNoRoutes - IP outnoroutes", + "refId": "O", + "step": 4 + }, + { + "expr": "irate(node_netstat_IpExt_InNoRoutes{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "InNoRoutes - IP datagrams discarded due to no routes in forwarding path", + "refId": "C", + "step": 4 + }, + { + "expr": "irate(node_netstat_IpExt_InCsumErrors{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "InCsumErrors - IP datagrams with checksum errors", + "refId": "A", + "step": 4 + }, + { + "expr": "irate(node_netstat_IpExt_InTruncatedPkts{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "InTruncatedPkts - IP datagrams discarded due to frame not carrying enough data", + "refId": "B", + "step": 4 + }, + { + "expr": "irate(node_netstat_Ip_InAddrErrors{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "InAddrErrors - IP inaddrerrors", + "refId": "D", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Netstat IP Errors / Discards", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Datagrams out (-) / in (+)", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + } + ], + "repeat": null, + "title": "Network Netstat", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 35 + }, + "id": 275, + "panels": [ + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 572 + }, + "height": "", + "id": 52, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideZero": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 2, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*Out.*/", + "transform": "negative-Y" + }, + { + "alias": "/.*InSegs.*/", + "color": "#CCA300" + }, + { + "alias": "/.*OutSegs.*/", + "color": "#CCA300" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_Tcp_InCsumErrors{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "InCsumErrors - Segments received with checksum errors", + "refId": "E", + "step": 4 + }, + { + "expr": "irate(node_netstat_Tcp_InErrs{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "InErrs - Segments received in error (e.g., bad TCP checksums)", + "refId": "F", + "step": 4 + }, + { + "expr": "irate(node_netstat_Tcp_InSegs{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "InSegs - Segments received, including those received in error. This count includes segments received on currently established connections", + "refId": "G", + "step": 4 + }, + { + "expr": "irate(node_netstat_Tcp_OutRsts{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "OutRsts - Segments sent containing the RST flag", + "refId": "I", + "step": 4 + }, + { + "expr": "irate(node_netstat_Tcp_OutSegs{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "OutSegs - Segments sent, including those on current connections but excluding those containing only retransmitted octets", + "refId": "J", + "step": 4 + }, + { + "expr": "irate(node_netstat_Tcp_RetransSegs{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "RetransSegs - Segments retransmitted - that is, the number of TCP segments transmitted containing one or more previously transmitted octets", + "refId": "A", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "TCP Segments", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Segments out (-) / in (+)", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 572 + }, + "height": "", + "id": 85, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 2, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*MaxConn *./", + "color": "#890F02", + "fill": 0 + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_netstat_Tcp_CurrEstab{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "CurrEstab - TCP connections for which the current state is either ESTABLISHED or CLOSE- WAIT", + "refId": "C", + "step": 4 + }, + { + "expr": "node_netstat_Tcp_MaxConn{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "MaxConn - Limit on the total number of TCP connections the entity can support (Dinamic is \"-1\")", + "refId": "H", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "TCP Connections", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Connections", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 582 + }, + "height": "", + "id": 86, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 2, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_netstat_Tcp_RtoAlgorithm{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "hide": true, + "intervalFactor": 2, + "legendFormat": "RtoAlgorithm - Algorithm used to determine the timeout value used for retransmitting unacknowledged octets", + "refId": "M", + "step": 4 + }, + { + "expr": "node_netstat_Tcp_RtoMax{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "RtoMax - Maximum value permitted by a TCP implementation for the retransmission timeout, measured in milliseconds", + "refId": "N", + "step": 4 + }, + { + "expr": "node_netstat_Tcp_RtoMin{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "RtoMin - Minimum value permitted by a TCP implementation for the retransmission timeout, measured in milliseconds", + "refId": "O", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "TCP Retransmission", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "ms", + "label": "Milliseconds", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 582 + }, + "height": "", + "id": 82, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 2, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_Tcp_ActiveOpens{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "ActiveOpens - TCP connections that have made a direct transition to the SYN-SENT state from the CLOSED state", + "refId": "A", + "step": 4 + }, + { + "expr": "irate(node_netstat_Tcp_AttemptFails{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "AttemptFails - TCP connections that have made a direct transition to the CLOSED state from either the SYN-SENT and SYN-RCVD", + "refId": "B", + "step": 4 + }, + { + "expr": "irate(node_netstat_Tcp_EstabResets{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "EstabResets - TCP connections that have made a direct transition to the CLOSED state from either the ESTABLISHED state or the CLOSE-WAIT state", + "refId": "D", + "step": 4 + }, + { + "expr": "irate(node_netstat_Tcp_PassiveOpens{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "PassiveOpens - TCP connections that have made a direct transition to the SYN-RCVD state from the LISTEN state", + "refId": "K", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "TCP Direct Transition", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Connections", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + } + ], + "repeat": null, + "title": "Network Netstat TCP", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 36 + }, + "id": 276, + "panels": [ + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 583 + }, + "height": "", + "id": 94, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 2, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_TcpExt_TCPAbortOnClose{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "TCPAbortOnClose - Connections aborted due to early user close", + "refId": "V", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPAbortOnData{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "TCPAbortOnData - Connections aborted due to unexpected data", + "refId": "W", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPAbortOnLinger{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "TCPAbortOnLinger - Connections aborted in lingered state after being closed", + "refId": "X", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPAbortOnMemory{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "TCPAbortOnMemory - Connections aborted before attached to a socket", + "refId": "Y", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPAbortOnTimeout{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "TCPAbortOnTimeout - Connections aborted due timeout", + "refId": "B", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPAbortFailed{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "TCPAbortFailed - Connections aborted without send RST due insuffient memory", + "refId": "A", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPTimeouts{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "TCPTimeouts - Other TCP connections timeouts", + "refId": "C", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "TCP Aborts / Tiemouts", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Connections", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 583 + }, + "height": "", + "id": 92, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 2, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_TcpExt_DelayedACKLocked{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "DelayedACKLocked - Delayed acks further delayed because of locked socket", + "refId": "C", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_DelayedACKLost{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "DelayedACKLost - Times quick ack mode was activated", + "refId": "D", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_DelayedACKs{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "DelayedACKs - Delayed acks sent", + "refId": "E", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "TCP Delayed ACK", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Counter", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 593 + }, + "height": "", + "id": 91, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 2, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*Sent.*/", + "transform": "negative-Y" + }, + { + "alias": "SyncookiesSent - SYN cookies sent", + "color": "#E0F9D7" + }, + { + "alias": "SyncookiesRecv - SYN cookies received", + "color": "#E0F9D7" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_TcpExt_SyncookiesFailed{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "SyncookiesFailed - Invalid SYN cookies received", + "refId": "R", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_SyncookiesRecv{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "SyncookiesRecv - SYN cookies received", + "refId": "S", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_SyncookiesSent{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "SyncookiesSent - SYN cookies sent", + "refId": "T", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPSYNChallenge{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "SynChallenge - Challenge ACKs sent in response to SYN packets", + "refId": "A", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPChallengeACK{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "intervalFactor": 2, + "legendFormat": "TCPChallengeACK - Challenge ACKs sent (RFC 5961 3.2)", + "refId": "B", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "TCP SynCookie / Challenge", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Counter out (-) / in (+)", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": null, + "description": "", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 593 + }, + "height": "", + "id": 90, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 2, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_TcpExt_TCPLossFailures{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "TCPLossFailures - Timeouts in loss state", + "refId": "C", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPLossProbeRecovery{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "TCPLossProbeRecovery - TCP loss probe recoveries", + "refId": "D", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPLossProbes{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "TCPLossProbes - Sent TCP loss probes", + "refId": "A", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPLossUndo{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "TCPLossUndo - Congestion windows recovered without slow start after partial ack", + "refId": "B", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPLostRetransmit{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "TCPLostRetransmit - Retransmits lost", + "refId": "E", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "TCP LOSS", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Counter", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 603 + }, + "height": "", + "id": 53, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 2, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_TcpExt_ListenDrops{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "ListenDrops - SYNs to LISTEN sockets ignored", + "refId": "H", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_LockDroppedIcmps{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "LockDroppedIcmps - ICMP packets dropped because socket was locked", + "refId": "J", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPDeferAcceptDrop{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "TCPDeferAcceptDrop - Dropped ACK frames received by a socket in SYN_RECV state", + "refId": "D", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPBacklogDrop{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "TCPBacklogDrop - Packets dropped bacause the socket's receive queue was full", + "refId": "P", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_OutOfWindowIcmps{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "OutOfWindowIcmps - ICMP packets dropped because they were out-of-window", + "refId": "A", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPMinTTLDrop{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "TCPMinTTLDrop - TCP packets dropped under minTTL condition", + "refId": "B", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "TCP DROPS", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Counter", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 603 + }, + "height": "", + "id": 101, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 2, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_TcpExt_TCPForwardRetrans{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "TCPForwardRetrans - Packets losts retransmitted with Forward RTO-Recovery", + "refId": "O", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPSlowStartRetrans{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "TCPSlowStartRetrans - Packets losts retransmitted after a slow start", + "refId": "P", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPSynRetrans{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "TCPSynRetrans - SYN-SYN/ACK retransmits to break down retransmissions in SYN, fast/timeout retransmits", + "refId": "Q", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPSpuriousRTOs{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "TCPSpuriousRTOs - FRTO's successfully detected spurious RTOs", + "refId": "A", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPSpuriousRtxHostQueues{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "TCPSpuriousRtxHostQueues - Times detected that the fast clone is not yet freed in tcp_transmit_skb()", + "refId": "B", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPFullUndo{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "TCPFullUndo - Retransmits that undid the CWND reduction", + "refId": "C", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPRetransFail{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "TCPRetransFail - Failed tcp_retransmit_skb() calls", + "refId": "D", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPPartialUndo{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "TCPPartialUndo - Congestion windows partially recovered using Hoe heuristic", + "refId": "E", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "TCP Retrans", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Counter", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 613 + }, + "height": "", + "id": 87, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 2, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_TcpExt_PruneCalled{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "PruneCalled - Pkts pruned from recv queue because of soc buf overrun", + "refId": "P", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_RcvPruned{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "RcvPruned - Packets pruned from receive queue", + "refId": "Q", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_OfoPruned{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "OfoPruned - Packets dropped from out-of-order queue because of socket buffer overrun", + "refId": "A", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "TCP Pruned", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Counter", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": null, + "description": "", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 613 + }, + "height": "", + "id": 96, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 2, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_TcpExt_TCPDirectCopyFromBacklog{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "TCPDirectCopyFromBacklog - Packets directly received from backlog", + "refId": "M", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPDirectCopyFromPrequeue{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "TCPDirectCopyFromPrequeue - Packets directly received from prequeue", + "refId": "N", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "TCP Direct Copy", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Counter", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 623 + }, + "height": "", + "id": 100, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 2, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_TcpExt_TW{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "TW - TCP sockets finished time wait in fast timer", + "refId": "O", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TWKilled{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "TWKilled - TCP sockets finished time wait in slow timer", + "refId": "P", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TWRecycled{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "TWRecycled - Time wait sockets recycled by time stamp", + "refId": "Q", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPTimeWaitOverflow{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "TCPTimeWaitOverflow - Occurences of time wait bucket overflow", + "refId": "A", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "TCP TimeWait", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Counter", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 623 + }, + "height": "", + "id": 93, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 2, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_TcpExt_PAWSActive{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "PAWSActive - Active connections rejected because of time stamp", + "refId": "M", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_PAWSEstab{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "PAWSEstab - Pkts rejects in estab connections because of timestamp", + "refId": "N", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_PAWSPassive{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "PAWSPassive - Passive connections rejected because of time stamp", + "refId": "O", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "TCP PAWS", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Counter", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": null, + "description": "", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 633 + }, + "height": "", + "id": 98, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 2, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_TcpExt_TCPSackRecovery{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "TCPSackRecovery - Times recovered from packet loss by selective acknowledgements", + "refId": "E", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPSackRecoveryFail{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "TCPSackRecoveryFail - Issue while recovering packets lost using selective ACK", + "refId": "F", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPSackShiftFallback{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "TCPSackShiftFallback - SACKs fallbacks", + "refId": "G", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPSackShifted{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "TCPSackShifted - SACKs shifted", + "refId": "H", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPSACKDiscard{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "TCPSackDiscard - Discarded due invalid SACK block.", + "refId": "A", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPSackFailures{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "TCPSackFailures - Timeouts after SACK recovery", + "refId": "B", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPSackMerged{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "TCPSackMerged - SACKs merged", + "refId": "C", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPSACKReneging{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "TCPSACKReneging - Bad SACK blocks received", + "refId": "D", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPSACKReorder{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "TCPSACKReorder - Times detected reordering using SACK", + "refId": "I", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "TCP SACK", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Counter", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": null, + "description": "", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 633 + }, + "height": "", + "id": 95, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 2, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_TcpExt_TCPDSACKIgnoredOld{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "TCPDSACKIgnoredOld - Discarded packets with duplicate SACK while retransmitting", + "refId": "F", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPDSACKOfoRecv{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "TCPDSACKOfoRecv - DSACKs for out of order packets received", + "refId": "G", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPDSACKOfoSent{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "TCPDSACKOfoSent - DSACKs sent for out of order packets", + "refId": "H", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPDSACKOldSent{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "TCPDSACKOldSent - DSACKs sent for old packets", + "refId": "I", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPDSACKRecv{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "TCPDSACKRecv - DSACKs received", + "refId": "J", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPDSACKUndo{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "TCPDSACKUndo - Discarded packets with erroneous retransmit", + "refId": "K", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPDSACKIgnoredNoUndo{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "TCPDSACKIgnoredNoUndo - Discarded packets with duplicate SACK", + "refId": "A", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "TCP DSACK", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Counter", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": null, + "description": "", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 643 + }, + "height": "", + "id": 97, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 2, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_TcpExt_TCPFastOpenActive{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "TCPFastOpenActive - Successful outbound TFO connections", + "refId": "P", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPFastOpenActiveFail{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "TCPFastOpenActiveFail - SYN-ACK packets received that did not acknowledge data sent in the SYN packet and caused a retransmissions without SYN data", + "refId": "Q", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPFastOpenCookieReqd{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "TCPFastOpenCookieReqd - Inbound SYN packets requesting TFO with TFO set but no cookie", + "refId": "R", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPFastOpenListenOverflow{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "TCPFastOpenListenOverflow - Times the fastopen listen queue overflowed", + "refId": "S", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPFastOpenPassive{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "TCPFastOpenPassive - Successful inbound TFO connections", + "refId": "T", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPFastOpenPassiveFail{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "TCPFastOpenPassiveFail - Inbound SYN packets with TFO cookie that was invalid", + "refId": "U", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPFastRetrans{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "TCPFastRetrans - Packets lost fast-retransmitted", + "refId": "V", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "TCP FastOpen / FastRetrans", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Counter", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": null, + "description": "", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 643 + }, + "height": "", + "id": 99, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 2, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_TcpExt_TCPHPAcks{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "TCPHPAcks - Acknowledgments not containing data received", + "refId": "Z", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPHPHits{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "TCPHPHits - Packets header predicted", + "refId": "A", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPHPHitsToUser{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "TCPHPHitsToUser - Packets header predicted and directly queued to user", + "refId": "B", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "TCP HP", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Counter", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 653 + }, + "height": "", + "id": 102, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 2, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_TcpExt_TCPToZeroWindowAdv{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "TCPToZeroWindowAdv - Times window went from zero to non-zero", + "refId": "V", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPWantZeroWindowAdv{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "TCPWantZeroWindowAdv - Times zero window announced", + "refId": "W", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPFromZeroWindowAdv{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "TCPFromZeroWindowAdv - Times window went from zero to non-zero", + "refId": "A", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "TCP ZeroWindow", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Counter", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 653 + }, + "height": "", + "id": 103, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 2, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_TcpExt_TCPFACKReorder{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "TCPFACKReorder - Detected packets with re-ordering using FACK", + "refId": "E", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPTSReorder{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "TCPTSReorder - Times detected packets with re-ordering using timestamp option", + "refId": "S", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "TCP Reorder", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Counter", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 663 + }, + "height": "", + "id": 162, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 2, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_TcpExt_TCPRenoFailures{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "TCPRenoFailures - Timeouts after reno fast retransmit", + "refId": "O", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPRenoRecovery{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "TCPRenoRecovery - Times recovered from packet loss due to fast retransmit", + "refId": "A", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPRenoRecoveryFail{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "TCPRenoRecoveryFail - Times reno fast retransmits failed", + "refId": "B", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPRenoReorder{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "TCPRenoReorder - Times detected reordering using reno fast retransmit", + "refId": "C", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "TCP Reno", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Counter", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 663 + }, + "height": "", + "id": 163, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 2, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_TcpExt_TCPReqQFullDoCookies{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "TCPReqQFullDoCookies - Times SYNCOOKIE was replied to client", + "refId": "O", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPReqQFullDrop{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "TCPReqQFullDrop - Times SYN request was dropped due to disabled syncookies", + "refId": "A", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "TCP ReqQ", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Counter", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 673 + }, + "height": "", + "id": 164, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 2, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_TcpExt_TCPOFODrop{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "TCPOFODrop - Packets meant to be queued in OFO but dropped because socket rcvbuf limit reached", + "refId": "P", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPOFOMerge{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "TCPOFOMerge - Packets in OFO that were merged with other packets", + "refId": "Q", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPOFOQueue{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "TCPOFOQueue - Packets queued in OFO queue", + "refId": "B", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "TCP Out of order", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Counter", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": null, + "description": "", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 673 + }, + "height": "", + "id": 165, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 2, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_TcpExt_TCPMD5NotFound{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "TCPMD5NotFound - Times MD5 hash expected but not found", + "refId": "Z", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPMD5Unexpected{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "TCPMD5Unexpected - Times MD5 hash unexpected but found", + "refId": "A", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "TCP MD5", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Counter", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": null, + "description": "", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 683 + }, + "height": "", + "id": 166, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 2, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_TcpExt_TCPPrequeued{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "TCPPrequeued - Packets directly queued to recvmsg prequeue", + "refId": "Z", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPPrequeueDropped{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "TCPPrequeueDropped - Packets dropped from prequeue", + "refId": "A", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "TCP Prequeued", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Counter", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": null, + "description": "", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 683 + }, + "height": "", + "id": 167, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 2, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_TcpExt_TCPRcvCoalesce{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "TCPRcvCoalesce - Times tried to coalesce the receive queue", + "refId": "Z", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPRcvCollapsed{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "TCPRcvCollapsed - Packets collapsed in receive queue due to low socket buffer", + "refId": "A", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "TCP Rcv", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Counter", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 693 + }, + "height": "", + "id": 224, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 2, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_TcpExt_TCPOrigDataSent{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "TCPOrigDataSent - Outgoing packets with original data", + "refId": "C", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "TCP Original Data", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Counter", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 693 + }, + "height": "", + "id": 225, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 2, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_TcpExt_ArpFilter{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "ArpFilter - Arp packets filtered", + "refId": "A", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_IPReversePathFilter{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "IPReversePathFilter - Packets arrive from non directly connected network", + "refId": "G", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "TCP Filters", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Counter", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 703 + }, + "height": "", + "id": 226, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 2, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_TcpExt_TCPPureAcks{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "TCPPureAcks - Acknowledgments not containing data payload received", + "refId": "C", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "TCP Pure ACK", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Counter", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 703 + }, + "height": "", + "id": 227, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 2, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_TcpExt_TCPAutoCorking{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "TCPAutoCorking - Times stack detected skb was underused and its flush was deferred", + "refId": "A", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "TCP Auto Corking", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Counter", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 713 + }, + "height": "", + "id": 104, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 2, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_TcpExt_BusyPollRxPackets{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "BusyPollRxPackets - Low latency application-fetched packets", + "refId": "B", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_EmbryonicRsts{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "EmbryonicRsts - Resets received for embryonic SYN_RECV sockets", + "refId": "F", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_ListenOverflows{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "ListenOverflows - Times the listen queue of a socket overflowed", + "refId": "I", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPSchedulerFailed{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "intervalFactor": 2, + "legendFormat": "TCPSchedulerFailed - Times receiver scheduled too late for direct processing", + "refId": "A", + "step": 4 + }, + { + "expr": "irate(node_netstat_TcpExt_TCPMemoryPressures{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "intervalFactor": 2, + "legendFormat": "TCPMemoryPressures - TCP ran low on memory", + "refId": "C", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "TCP Issues", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Counter", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + } + ], + "repeat": null, + "title": "Network Netstat TCP Linux MIPs", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 37 + }, + "id": 277, + "panels": [ + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": null, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 714 + }, + "height": "", + "id": 55, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 2, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*Out.*/", + "transform": "negative-Y" + }, + { + "alias": "/.*Snd.*/", + "transform": "negative-Y" + }, + { + "alias": "/.*Datagrams.*/", + "color": "#EAB839" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_Udp_InDatagrams{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "InDatagrams - Datagrams received", + "refId": "B", + "step": 4 + }, + { + "expr": "irate(node_netstat_Udp_OutDatagrams{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "OutDatagrams - Datagrams sent", + "refId": "E", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "UDP In / Out", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Datagrams out (-) / in (+)", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 714 + }, + "height": "", + "id": 109, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 2, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*Out.*/", + "transform": "negative-Y" + }, + { + "alias": "/.*Snd.*/", + "transform": "negative-Y" + }, + { + "alias": "/.*bufErrors.*/", + "color": "#70DBED" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_Udp_InCsumErrors{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "InCsumErrors - Datagrams with checksum errors", + "refId": "A", + "step": 4 + }, + { + "expr": "irate(node_netstat_Udp_InErrors{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "InErrors - Datagrams that could not be delivered to an application", + "refId": "C", + "step": 4 + }, + { + "expr": "irate(node_netstat_Udp_RcvbufErrors{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "RcvbufErrors - Datagrams for which not enough socket buffer memory to receive", + "refId": "F", + "step": 4 + }, + { + "expr": "irate(node_netstat_Udp_SndbufErrors{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "SndbufErrors - Datagrams for which not enough socket buffer memory to transmit", + "refId": "G", + "step": 4 + }, + { + "expr": "irate(node_netstat_Udp_NoPorts{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "NoPorts - Datagrams received on a port with no listener", + "refId": "B", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "UDP Errors", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Datagrams out (-) / in (+)", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 724 + }, + "height": "", + "id": 57, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 2, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*Out.*/", + "transform": "negative-Y" + }, + { + "alias": "/.*Datagrams.*/", + "color": "#EAB839" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_UdpLite_InDatagrams{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "InDatagrams - Packets received", + "refId": "B", + "step": 4 + }, + { + "expr": "irate(node_netstat_UdpLite_OutDatagrams{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "OutDatagrams - Packets sent", + "refId": "E", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "UDP Lite In / Out", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Datagrams out (-) / in (+)", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 724 + }, + "height": "", + "id": 110, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 2, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*Out.*/", + "transform": "negative-Y" + }, + { + "alias": "/.*bufErrors.*/", + "color": "#6ED0E0" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_UdpLite_InCsumErrors{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "InCsumErrors - Datagrams with checksum errors", + "refId": "A", + "step": 4 + }, + { + "expr": "irate(node_netstat_UdpLite_InErrors{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "InErrors - Datagrams that could not be delivered to an application", + "refId": "C", + "step": 4 + }, + { + "expr": "irate(node_netstat_UdpLite_RcvbufErrors{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "RcvbufErrors - Datagrams for which not enough socket buffer memory to receive", + "refId": "F", + "step": 4 + }, + { + "expr": "irate(node_netstat_UdpLite_SndbufErrors{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "SndbufErrors - Datagrams for which not enough socket buffer memory to transmit", + "refId": "G", + "step": 4 + }, + { + "expr": "irate(node_netstat_UdpLite_NoPorts{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "NoPorts - Datagrams received on a port with no listener", + "refId": "B", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "UDP Lite Errors", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Datagrams out (-) / in (+)", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + } + ], + "repeat": null, + "title": "Network Netstat UDP", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 38 + }, + "id": 278, + "panels": [ + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": null, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 725 + }, + "height": "", + "id": 50, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 2, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*Out.*/", + "transform": "negative-Y" + }, + { + "alias": "/.*Type3.*/", + "color": "#EAB839" + }, + { + "alias": "/.*SrcQuenchs.*/", + "color": "#705DA0" + }, + { + "alias": "/.*ParmProb.*/", + "color": "#70DBED" + }, + { + "alias": "/.*TimeExcds.*/", + "color": "#EA6460" + }, + { + "alias": "/.*DestUnreachs.*/", + "color": "#7EB26D" + }, + { + "alias": "/.*InErrors.*/", + "color": "#890F02" + }, + { + "alias": "/.*OutErrors.*/", + "color": "#890F02" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_Icmp_InErrors{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "InErrors - Messages which the entity received but determined as having ICMP-specific errors (bad ICMP checksums, bad length, etc.)", + "refId": "I", + "step": 4 + }, + { + "expr": "irate(node_netstat_Icmp_OutErrors{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "OutErrors - Messages which this entity did not send due to problems discovered within ICMP, such as a lack of buffers", + "refId": "V", + "step": 4 + }, + { + "expr": "irate(node_netstat_Icmp_InDestUnreachs{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "InDestUnreachs - Destination Unreachable messages received", + "refId": "A", + "step": 4 + }, + { + "expr": "irate(node_netstat_Icmp_OutDestUnreachs{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "OutDestUnreachs - Destination Unreachable messages sent", + "refId": "B", + "step": 4 + }, + { + "expr": "irate(node_netstat_IcmpMsg_InType3{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "InType3 - Destination unreachable", + "refId": "K", + "step": 4 + }, + { + "expr": "irate(node_netstat_IcmpMsg_OutType3{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "OutType3 - Destination unreachable", + "refId": "L", + "step": 4 + }, + { + "expr": "irate(node_netstat_IcmpMsg_InType11{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "InType11 - Time Exceeded", + "refId": "C", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "ICMP Errors 1", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Messages out (-) / in (+)", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": null, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 725 + }, + "height": "", + "id": 147, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 2, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*Out.*/", + "transform": "negative-Y" + }, + { + "alias": "/.*Type3.*/", + "color": "#EAB839" + }, + { + "alias": "/.*SrcQuenchs.*/", + "color": "#705DA0" + }, + { + "alias": "/.*ParmProb.*/", + "color": "#70DBED" + }, + { + "alias": "/.*TimeExcds.*/", + "color": "#EA6460" + }, + { + "alias": "/.*DestUnreachs.*/", + "color": "#7EB26D" + }, + { + "alias": "/.*InErrors.*/", + "color": "#890F02" + }, + { + "alias": "/.*OutErrors.*/", + "color": "#890F02" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_Icmp_InCsumErrors{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "InCsumErrors - Messages with ICMP checksum errors", + "refId": "E", + "step": 4 + }, + { + "expr": "irate(node_netstat_Icmp_InTimeExcds{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "InTimeExcds - Time Exceeded messages received", + "refId": "C", + "step": 4 + }, + { + "expr": "irate(node_netstat_Icmp_OutTimeExcds{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "OutTimeExcds - Time Exceeded messages sent", + "refId": "D", + "step": 4 + }, + { + "expr": "irate(node_netstat_Icmp_InParmProbs{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "InParmProbs - Parameter Problem messages received", + "refId": "F", + "step": 4 + }, + { + "expr": "irate(node_netstat_Icmp_OutParmProbs{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "OutParmProb - Parameter Problem messages sent", + "refId": "G", + "step": 4 + }, + { + "expr": "irate(node_netstat_Icmp_InSrcQuenchs{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "InSrcQuenchs - Source Quench messages received", + "refId": "H", + "step": 4 + }, + { + "expr": "irate(node_netstat_Icmp_OutSrcQuenchs{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "OutSrcQuenchs - Source Quench messages sent", + "refId": "J", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "ICMP Errors 2", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Messages out (-) / in (+)", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": null, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 735 + }, + "height": "", + "id": 115, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 2, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*Out.*/", + "transform": "negative-Y" + }, + { + "alias": "/.*Msgs.*/", + "color": "#6ED0E0" + }, + { + "alias": "/.*Redirects.*/", + "color": "#F9BA8F" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_Icmp_InMsgs{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "InMsgs - Messages which the entity received. Note that this counter includes all those counted by icmpInErrors", + "refId": "J", + "step": 4 + }, + { + "expr": "irate(node_netstat_Icmp_InRedirects{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "InRedirects - Redirect messages received", + "refId": "L", + "step": 4 + }, + { + "expr": "irate(node_netstat_Icmp_OutMsgs{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "OutMsgs - Messages which this entity attempted to send. Note that this counter includes all those counted by icmpOutErrors", + "refId": "W", + "step": 4 + }, + { + "expr": "irate(node_netstat_Icmp_OutRedirects{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "OutRedirects - Redirect messages sent. For a host, this object will always be zero, since hosts do not send redirects", + "refId": "Y", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "ICMP In / Out - Messages / Redirects", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Messages out (-) / in (+)", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": null, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 735 + }, + "height": "", + "id": 112, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 2, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*Out.*/", + "transform": "negative-Y" + }, + { + "alias": "/.*TimestampReps.*/", + "color": "#F9934E" + }, + { + "alias": "/.*Timestamps -.*/", + "color": "#6ED0E0" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_Icmp_InTimestampReps{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "InTimestampReps - Timestamp Reply messages received", + "refId": "O", + "step": 4 + }, + { + "expr": "irate(node_netstat_Icmp_InTimestamps{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "InTimestamps - Timestamp (request) messages received", + "refId": "P", + "step": 4 + }, + { + "expr": "irate(node_netstat_Icmp_OutTimestampReps{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "OutTimestampReps - Timestamp Reply messages sent", + "refId": "A", + "step": 4 + }, + { + "expr": "irate(node_netstat_Icmp_OutTimestamps{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "OutTimestamps - Timestamp (request) messages sent", + "refId": "B", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "ICMP Timestamps", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Messages out (-) / in (+)", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": null, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 745 + }, + "height": "", + "id": 114, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 2, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*Out.*/", + "transform": "negative-Y" + }, + { + "alias": "/.*EchoReps.*/", + "color": "#D683CE" + }, + { + "alias": "/.*Echos -.*/", + "color": "#F9934E" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_Icmp_InEchoReps{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "InEchoReps - Echo Reply messages received", + "refId": "G", + "step": 4 + }, + { + "expr": "irate(node_netstat_Icmp_InEchos{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "InEchos - Echo (request) messages received", + "refId": "H", + "step": 4 + }, + { + "expr": "irate(node_netstat_Icmp_OutEchoReps{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "OutEchoReps - Echo Reply messages sent", + "refId": "T", + "step": 4 + }, + { + "expr": "irate(node_netstat_Icmp_OutEchos{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "OutEchos - Echo (request) messages sent", + "refId": "U", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "ICMP Echos", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Messages out (-) / in (+)", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": null, + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 745 + }, + "height": "", + "id": 113, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideZero": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 2, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*Out.*/", + "transform": "negative-Y" + }, + { + "alias": "/.*AddrMaskReps.*/", + "color": "#B7DBAB" + }, + { + "alias": "/.*Masks -.*/", + "color": "#E5AC0E" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(node_netstat_Icmp_InAddrMaskReps{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "InAddrMaskReps - Address Mask Reply messages received", + "refId": "C", + "step": 4 + }, + { + "expr": "irate(node_netstat_Icmp_InAddrMasks{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "InAddrMasks - Address Mask Request messages received", + "refId": "D", + "step": 4 + }, + { + "expr": "irate(node_netstat_Icmp_OutAddrMaskReps{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "OutAddrMaskReps - Address Mask Reply messages sent", + "refId": "Q", + "step": 4 + }, + { + "expr": "irate(node_netstat_Icmp_OutAddrMasks{instance=~\"$node:$port\",job=~\"$job\"}[5m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "OutAddrMasks - Address Mask Request messages sent", + "refId": "R", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "ICMP Masks", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Messages out (-) / in (+)", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + } + ], + "repeat": null, + "title": "Network Netstat ICMP", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 39 + }, + "id": 279, + "panels": [ + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 746 + }, + "id": 40, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "node_scrape_collector_duration_seconds{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "{{collector}} - Scrape duration", + "refId": "A", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Node Exporter Scrape Time", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": "Seconds", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "", + "fill": 2, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 746 + }, + "id": 157, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "node_scrape_collector_success{instance=~\"$node:$port\",job=~\"$job\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "{{collector}} - Scrape success", + "refId": "A", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Node Exporter Scrape Success", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "Counter", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + } + ], + "repeat": null, + "title": "Node Exporter", + "type": "row" + } + ], + "refresh": false, + "schemaVersion": 16, + "style": "dark", + "tags": [], + "templating": { + "list": [ + { + "allValue": null, + "current": {}, + "datasource": "Prometheus", + "hide": 0, + "includeAll": false, + "label": "Job", + "multi": false, + "name": "job", + "options": [], + "query": "label_values(node_exporter_build_info, job)", + "refresh": 1, + "regex": "", + "sort": 1, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allValue": null, + "current": {}, + "datasource": "Prometheus", + "hide": 0, + "includeAll": false, + "label": "Host:", + "multi": false, + "name": "node", + "options": [], + "query": "label_values(node_exporter_build_info{job=~\"$job\"}, instance)", + "refresh": 1, + "regex": "/([^:]+):.*/", + "sort": 1, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allValue": null, + "current": {}, + "datasource": "Prometheus", + "hide": 0, + "includeAll": false, + "label": "Port", + "multi": false, + "name": "port", + "options": [], + "query": "label_values(node_exporter_build_info{instance=~\"$node:(.*)\"}, instance)", + "refresh": 1, + "regex": "/[^:]+:(.*)/", + "sort": 3, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + } + ] + }, + "time": { + "from": "now-24h", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "timezone": "browser", + "title": "Node Exporter", + "uid": "oQbaawXiz", + "version": 1 +} diff --git a/helm-charts/nem-monitoring/grafana-dashboards/onos-kpi.json b/helm-charts/nem-monitoring/grafana-dashboards/onos-kpi.json new file mode 100644 index 0000000..a1e2c0e --- /dev/null +++ b/helm-charts/nem-monitoring/grafana-dashboards/onos-kpi.json @@ -0,0 +1,652 @@ +{ + "annotations": { + "list": [ + { + "$$hashKey": "object:204", + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "gnetId": null, + "graphTooltip": 0, + "iteration": 1541038643440, + "links": [], + "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 5, + "panels": [], + "repeat": "device", + "scopedVars": { + "device": { + "$$hashKey": "object:861", + "selected": false, + "text": "of:0000000000000001", + "value": "of:0000000000000001" + } + }, + "title": "Device $device", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 1, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 1 + }, + "id": 6, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeatDirection": "h", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:335", + "expr": "onos_rx_bytes_total{device_id=\"$device\"} / 1024 / 1024", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{ device_id }}:{{ port_id }}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Received MB", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 1, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 1 + }, + "id": 7, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeatDirection": "h", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:335", + "expr": "onos_tx_bytes_total{device_id=\"$device\"} / 1024 / 1024", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{ device_id }}:{{ port_id }}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Transmitted MB", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 1, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 9 + }, + "id": 2, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "scopedVars": { + "device": { + "$$hashKey": "object:861", + "selected": false, + "text": "of:0000000000000001", + "value": "of:0000000000000001" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:335", + "expr": "onos_rx_packets_total{device_id=\"$device\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{ device_id }}:{{ port_id }}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Received Packets", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 1, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 9 + }, + "id": 3, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "scopedVars": { + "device": { + "$$hashKey": "object:861", + "selected": false, + "text": "of:0000000000000001", + "value": "of:0000000000000001" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:335", + "expr": "onos_tx_packets_total{device_id=\"$device\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{ device_id }}:{{ port_id }}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Transmitted Packets", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 1, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 17 + }, + "id": 8, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeatDirection": "h", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:335", + "expr": "onos_rx_drop_packets_total{device_id=\"$device\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{ device_id }}:{{ port_id }}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Received Packets Dropped", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 1, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 17 + }, + "id": 9, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeatDirection": "h", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:335", + "expr": "onos_tx_drop_packets_total{device_id=\"$device\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{ device_id }}:{{ port_id }}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Transmitted Packets Dropped", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + } + ], + "refresh": "10s", + "schemaVersion": 16, + "style": "dark", + "tags": [], + "templating": { + "list": [ + { + "allValue": null, + "current": { + "tags": [], + "text": "All", + "value": [ + "$__all" + ] + }, + "datasource": "Prometheus", + "hide": 0, + "includeAll": true, + "label": null, + "multi": true, + "name": "device", + "options": [], + "query": "label_values(onos_rx_packets_total, device_id)", + "refresh": 1, + "regex": "", + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + } + ] + }, + "time": { + "from": "now-5m", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "timezone": "", + "title": "ONOS KPIs", + "uid": "kqqYHvaiz", + "version": 1 +} \ No newline at end of file diff --git a/helm-charts/nem-monitoring/grafana-dashboards/voltha-kpi.json b/helm-charts/nem-monitoring/grafana-dashboards/voltha-kpi.json new file mode 100644 index 0000000..b76bb2f --- /dev/null +++ b/helm-charts/nem-monitoring/grafana-dashboards/voltha-kpi.json @@ -0,0 +1,1172 @@ +{ + "annotations": { + "list": [ + { + "$$hashKey": "object:894", + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "description": "Display KPIs as collected by VOLTHA", + "editable": true, + "gnetId": null, + "graphTooltip": 0, + "iteration": 1541700702670, + "links": [], + "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 7, + "panels": [], + "title": "Bytes", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "Count the tx bytes on the NNI ports by device", + "fill": 1, + "gridPos": { + "h": 9, + "w": 12, + "x": 0, + "y": 1 + }, + "id": 9, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:187", + "expr": "sum(voltha_tx_bytes_total{title=\"Ethernet\"})by(logical_device_id) / 1024 / 1024", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{logical_device_id}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Transmitted MB by device", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "Count the rx bytes on the NNI ports by device", + "fill": 1, + "gridPos": { + "h": 9, + "w": 12, + "x": 12, + "y": 1 + }, + "id": 10, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:241", + "expr": "sum(voltha_rx_bytes_total{title=\"Ethernet\"})by(logical_device_id) / 1024 / 1024", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{logical_device_id}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Received MB by device", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 10 + }, + "id": 2, + "panels": [], + "title": "Packets", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "Count the tx packets on the NNI ports by device", + "fill": 1, + "gridPos": { + "h": 9, + "w": 12, + "x": 0, + "y": 11 + }, + "id": 4, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:295", + "expr": "sum(voltha_tx_packets_total{title=\"Ethernet\"})by(logical_device_id)", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{logical_device_id}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Transmitted packets by device", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "Count the rx packets on the NNI ports by device", + "fill": 1, + "gridPos": { + "h": 9, + "w": 12, + "x": 12, + "y": 11 + }, + "id": 5, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:349", + "expr": "sum(voltha_rx_packets_total{title=\"Ethernet\"})by(logical_device_id)", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{logical_device_id}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Received packets by device", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 20 + }, + "id": 14, + "panels": [], + "title": "Realtime Traffic Data", + "type": "row" + }, + { + "alert": { + "conditions": [ + { + "evaluator": { + "params": [ + 5 + ], + "type": "gt" + }, + "operator": { + "type": "and" + }, + "query": { + "params": [ + "A", + "1m", + "now" + ] + }, + "reducer": { + "params": [], + "type": "sum" + }, + "type": "query" + } + ], + "executionErrorState": "alerting", + "frequency": "60s", + "handler": 1, + "name": "Realtime Incoming MB by NNI port alert", + "noDataState": "no_data", + "notifications": [] + }, + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": null, + "fill": 1, + "gridPos": { + "h": 10, + "w": 24, + "x": 0, + "y": 21 + }, + "id": 12, + "legend": { + "avg": false, + "current": false, + "hideEmpty": true, + "hideZero": true, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:362", + "expr": "delta(voltha_rx_bytes_total{title=\"Ethernet\"}[30s]) / 1024 / 1024", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{logical_device_id}}", + "refId": "A" + } + ], + "thresholds": [ + { + "colorMode": "critical", + "fill": true, + "line": true, + "op": "gt", + "value": 5 + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Realtime Incoming MB by NNI port", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:421", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "$$hashKey": "object:422", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 31 + }, + "id": 19, + "panels": [], + "title": "Per device informations", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": null, + "fill": 1, + "gridPos": { + "h": 9, + "w": 12, + "x": 0, + "y": 32 + }, + "id": 21, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 12, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": "olt", + "repeatDirection": "v", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:987", + "expr": "voltha_rx_bytes_total{title=\"PON\", logical_device_id=\"$olt\"} / 1024 / 1024", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{pon_id}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Received MB per PON on device $olt", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:1472", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "$$hashKey": "object:1473", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": null, + "fill": 1, + "gridPos": { + "h": 9, + "w": 12, + "x": 12, + "y": 32 + }, + "id": 26, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 12, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": "olt", + "repeatDirection": "v", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:987", + "expr": "voltha_tx_bytes_total{title=\"PON\", logical_device_id=\"$olt\"} / 1024 / 1024", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{pon_id}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Transmitted MB per PON on device $olt", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:1472", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "$$hashKey": "object:1473", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 1, + "gridPos": { + "h": 9, + "w": 12, + "x": 0, + "y": 41 + }, + "id": 32, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:637", + "expr": "voltha_tx_bytes_total{title=\"Ethernet_Bridge_Port_History\", serial_number=\"$onu\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{serial_number}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "ONU Transmitted Bytes on $onu", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": null, + "fill": 1, + "gridPos": { + "h": 9, + "w": 12, + "x": 12, + "y": 41 + }, + "id": 28, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:432", + "expr": "voltha_tx_packets_total{title=\"Ethernet_Bridge_Port_History\", serial_number=\"$onu\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{serial_number}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "ONU Transmitted Packets on $onu", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 1, + "gridPos": { + "h": 9, + "w": 12, + "x": 0, + "y": 50 + }, + "id": 34, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:836", + "expr": "voltha_rx_bytes_total{title=\"Ethernet_Bridge_Port_History\", serial_number=\"$onu\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{serial_number}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "ONU Received Bytes on $onu", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": null, + "fill": 1, + "gridPos": { + "h": 9, + "w": 12, + "x": 12, + "y": 50 + }, + "id": 30, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:537", + "expr": "voltha_rx_packets_total{title=\"Ethernet_Bridge_Port_History\", serial_number=\"$onu\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{serial_number}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "ONU Received Packets on $onu", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + } + ], + "refresh": "15s", + "schemaVersion": 16, + "style": "dark", + "tags": [], + "templating": { + "list": [ + { + "allValue": null, + "current": { + "text": "All", + "value": "$__all" + }, + "datasource": "Prometheus", + "hide": 0, + "includeAll": true, + "label": "OLT Device", + "multi": false, + "name": "olt", + "options": [], + "query": "label_values(voltha_tx_bytes_total, logical_device_id)", + "refresh": 1, + "regex": "", + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allValue": null, + "current": { + "text": "All", + "value": "$__all" + }, + "datasource": "Prometheus", + "hide": 0, + "includeAll": true, + "label": null, + "multi": false, + "name": "onu", + "options": [ + { + "$$hashKey": "object:232", + "selected": true, + "text": "All", + "value": "$__all" + }, + { + "$$hashKey": "object:233", + "selected": false, + "text": "ISKT71e801a0", + "value": "ISKT71e801a0" + } + ], + "query": "label_values(voltha_tx_packets_total{title=\"Ethernet_Bridge_Port_History\"}, serial_number)", + "refresh": 0, + "regex": "", + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + } + ] + }, + "time": { + "from": "now-1h", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "timezone": "", + "title": "Voltha", + "uid": "i9V9JtOmz", + "version": 1 +} \ No newline at end of file diff --git a/helm-charts/nem-monitoring/grafana-dashboards/xos.json b/helm-charts/nem-monitoring/grafana-dashboards/xos.json new file mode 100644 index 0000000..7e4da5c --- /dev/null +++ b/helm-charts/nem-monitoring/grafana-dashboards/xos.json @@ -0,0 +1,7959 @@ +{ + "annotations": { + "list": [ + { + "$$hashKey": "object:297", + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "description": "Monitoring XOS Activities", + "editable": true, + "gnetId": null, + "graphTooltip": 0, + "iteration": 1538693445200, + "links": [], + "panels": [ + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": null, + "fill": 1, + "gridPos": { + "h": 9, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 234, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:1453", + "expr": "rate(grpc_request_latency_seconds_sum[5m]) / rate(grpc_request_latency_seconds_count[5m])", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{model_name}} - {{endpoint}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Average request duration in the last 5 minutes", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 9 + }, + "id": 152, + "panels": [], + "title": "Requests by status", + "type": "row" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "#299c46", + "rgba(237, 129, 40, 0.89)", + "#d44a3a" + ], + "datasource": null, + "format": "none", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 0, + "y": 10 + }, + "id": 227, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "minSpan": 4, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "repeat": "request_status", + "repeatDirection": "h", + "scopedVars": { + "request_status": { + "$$hashKey": "object:807", + "selected": false, + "text": "OK", + "value": "OK" + } + }, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "$$hashKey": "object:1071", + "expr": "sum(grpc_request_count_total{status=\"StatusCode.$request_status\"})", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "", + "refId": "A" + } + ], + "thresholds": "", + "title": "Total requests resulted in $request_status", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "#299c46", + "rgba(237, 129, 40, 0.89)", + "#d44a3a" + ], + "datasource": null, + "format": "none", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 8, + "y": 10 + }, + "id": 235, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "minSpan": 4, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 227, + "scopedVars": { + "request_status": { + "$$hashKey": "object:808", + "selected": false, + "text": "PERMISSION_DENIED", + "value": "PERMISSION_DENIED" + } + }, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "$$hashKey": "object:1071", + "expr": "sum(grpc_request_count_total{status=\"StatusCode.$request_status\"})", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "", + "refId": "A" + } + ], + "thresholds": "", + "title": "Total requests resulted in $request_status", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "#299c46", + "rgba(237, 129, 40, 0.89)", + "#d44a3a" + ], + "datasource": null, + "format": "none", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 16, + "y": 10 + }, + "id": 236, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "minSpan": 4, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 227, + "scopedVars": { + "request_status": { + "$$hashKey": "object:809", + "selected": false, + "text": "UNAUTHENTICATED", + "value": "UNAUTHENTICATED" + } + }, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "$$hashKey": "object:1071", + "expr": "sum(grpc_request_count_total{status=\"StatusCode.$request_status\"})", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "", + "refId": "A" + } + ], + "thresholds": "", + "title": "Total requests resulted in $request_status", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 19 + }, + "id": 77, + "panels": [], + "title": "Requests per model", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 0, + "y": 20 + }, + "id": 2, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": "model", + "repeatDirection": "h", + "scopedVars": { + "model": { + "selected": false, + "text": "AddressPool", + "value": "AddressPool" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 6, + "y": 20 + }, + "id": 237, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "AttWorkflowDriverService", + "value": "AttWorkflowDriverService" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 12, + "y": 20 + }, + "id": 238, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "AttWorkflowDriverServiceInstance", + "value": "AttWorkflowDriverServiceInstance" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 18, + "y": 20 + }, + "id": 239, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "AttWorkflowDriverWhiteListEntry", + "value": "AttWorkflowDriverWhiteListEntry" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 0, + "y": 29 + }, + "id": 240, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "BNGPortMapping", + "value": "BNGPortMapping" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 6, + "y": 29 + }, + "id": 241, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "ComputeServiceInstance", + "value": "ComputeServiceInstance" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 12, + "y": 29 + }, + "id": 242, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "Controller", + "value": "Controller" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 18, + "y": 29 + }, + "id": 243, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "ControllerNetwork", + "value": "ControllerNetwork" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 0, + "y": 38 + }, + "id": 244, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "ControllerRole", + "value": "ControllerRole" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 6, + "y": 38 + }, + "id": 245, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "ControllerSite", + "value": "ControllerSite" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 12, + "y": 38 + }, + "id": 246, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "ControllerSitePrivilege", + "value": "ControllerSitePrivilege" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 18, + "y": 38 + }, + "id": 247, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "ControllerSlice", + "value": "ControllerSlice" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 0, + "y": 47 + }, + "id": 248, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "ControllerSlicePrivilege", + "value": "ControllerSlicePrivilege" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 6, + "y": 47 + }, + "id": 249, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "ControllerUser", + "value": "ControllerUser" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 12, + "y": 47 + }, + "id": 250, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "Deployment", + "value": "Deployment" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 18, + "y": 47 + }, + "id": 251, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "DynamicLoad", + "value": "DynamicLoad" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 0, + "y": 56 + }, + "id": 252, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "FabricCrossconnectService", + "value": "FabricCrossconnectService" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 6, + "y": 56 + }, + "id": 253, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "FabricCrossconnectServiceInstance", + "value": "FabricCrossconnectServiceInstance" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 12, + "y": 56 + }, + "id": 254, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "FabricService", + "value": "FabricService" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 18, + "y": 56 + }, + "id": 255, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "Flavor", + "value": "Flavor" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 0, + "y": 65 + }, + "id": 256, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "Image", + "value": "Image" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 6, + "y": 65 + }, + "id": 257, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "ImageDeployments", + "value": "ImageDeployments" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 12, + "y": 65 + }, + "id": 258, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "Instance", + "value": "Instance" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 18, + "y": 65 + }, + "id": 259, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "InterfaceType", + "value": "InterfaceType" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 0, + "y": 74 + }, + "id": 260, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "Modeldefs", + "value": "Modeldefs" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 6, + "y": 74 + }, + "id": 261, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "Network", + "value": "Network" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 12, + "y": 74 + }, + "id": 262, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "NetworkParameter", + "value": "NetworkParameter" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 18, + "y": 74 + }, + "id": 263, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "NetworkParameterType", + "value": "NetworkParameterType" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 0, + "y": 83 + }, + "id": 264, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "NetworkSlice", + "value": "NetworkSlice" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 6, + "y": 83 + }, + "id": 265, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "NetworkTemplate", + "value": "NetworkTemplate" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 12, + "y": 83 + }, + "id": 266, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "NNIPort", + "value": "NNIPort" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 18, + "y": 83 + }, + "id": 267, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "Node", + "value": "Node" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 0, + "y": 92 + }, + "id": 268, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "NodeLabel", + "value": "NodeLabel" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 6, + "y": 92 + }, + "id": 269, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "NodeToSwitchPort", + "value": "NodeToSwitchPort" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 12, + "y": 92 + }, + "id": 270, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "OLTDevice", + "value": "OLTDevice" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 18, + "y": 92 + }, + "id": 271, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "ONOSApp", + "value": "ONOSApp" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 0, + "y": 101 + }, + "id": 272, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "ONOSService", + "value": "ONOSService" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 6, + "y": 101 + }, + "id": 273, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "ONUDevice", + "value": "ONUDevice" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 12, + "y": 101 + }, + "id": 274, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "PONONUPort", + "value": "PONONUPort" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 18, + "y": 101 + }, + "id": 275, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "PONPort", + "value": "PONPort" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 0, + "y": 110 + }, + "id": 276, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "Port", + "value": "Port" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 6, + "y": 110 + }, + "id": 277, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "PortInterface", + "value": "PortInterface" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 12, + "y": 110 + }, + "id": 278, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "Principal", + "value": "Principal" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 18, + "y": 110 + }, + "id": 279, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "Privilege", + "value": "Privilege" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 0, + "y": 119 + }, + "id": 280, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "RCORDService", + "value": "RCORDService" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 6, + "y": 119 + }, + "id": 281, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "RCORDSubscriber", + "value": "RCORDSubscriber" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 12, + "y": 119 + }, + "id": 282, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "Role", + "value": "Role" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 18, + "y": 119 + }, + "id": 283, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "Service", + "value": "Service" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 0, + "y": 128 + }, + "id": 284, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "ServiceAttribute", + "value": "ServiceAttribute" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 6, + "y": 128 + }, + "id": 285, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "ServiceDependency", + "value": "ServiceDependency" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 12, + "y": 128 + }, + "id": 286, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "ServiceGraphConstraint", + "value": "ServiceGraphConstraint" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 18, + "y": 128 + }, + "id": 287, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "ServiceInstance", + "value": "ServiceInstance" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 0, + "y": 137 + }, + "id": 288, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "ServiceInstanceAttribute", + "value": "ServiceInstanceAttribute" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 6, + "y": 137 + }, + "id": 289, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "ServiceInstanceLink", + "value": "ServiceInstanceLink" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 12, + "y": 137 + }, + "id": 290, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "ServiceInterface", + "value": "ServiceInterface" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 18, + "y": 137 + }, + "id": 291, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "ServicePort", + "value": "ServicePort" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 0, + "y": 146 + }, + "id": 292, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "Site", + "value": "Site" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 6, + "y": 146 + }, + "id": 293, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "SiteDeployment", + "value": "SiteDeployment" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 12, + "y": 146 + }, + "id": 294, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "SitePrivilege", + "value": "SitePrivilege" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 18, + "y": 146 + }, + "id": 295, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "SiteRole", + "value": "SiteRole" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 0, + "y": 155 + }, + "id": 296, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "Slice", + "value": "Slice" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 6, + "y": 155 + }, + "id": 297, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "SlicePrivilege", + "value": "SlicePrivilege" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 12, + "y": 155 + }, + "id": 298, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "SliceRole", + "value": "SliceRole" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 18, + "y": 155 + }, + "id": 299, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "Switch", + "value": "Switch" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 0, + "y": 164 + }, + "id": 300, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "SwitchPort", + "value": "SwitchPort" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 6, + "y": 164 + }, + "id": 301, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "Tag", + "value": "Tag" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 12, + "y": 164 + }, + "id": 302, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "TenantWithContainer", + "value": "TenantWithContainer" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 18, + "y": 164 + }, + "id": 303, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "TrustDomain", + "value": "TrustDomain" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 0, + "y": 173 + }, + "id": 304, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "UNIPort", + "value": "UNIPort" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 6, + "y": 173 + }, + "id": 305, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "User", + "value": "User" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 12, + "y": 173 + }, + "id": 306, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "Utilities", + "value": "Utilities" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 18, + "y": 173 + }, + "id": 307, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "VOLTService", + "value": "VOLTService" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 0, + "y": 182 + }, + "id": 308, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "VOLTServiceInstance", + "value": "VOLTServiceInstance" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 6, + "y": 182 + }, + "id": 309, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "XOSCore", + "value": "XOSCore" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "description": "List all the request related to this model", + "fill": 1, + "gridPos": { + "h": 9, + "w": 6, + "x": 12, + "y": 182 + }, + "id": 310, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "minSpan": 6, + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1538693445200, + "repeatPanelId": 2, + "scopedVars": { + "model": { + "selected": false, + "text": "XOSGuiExtension", + "value": "XOSGuiExtension" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "$$hashKey": "object:492", + "expr": "grpc_request_count_total{model_name=\"$model\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{endpoint}} - {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests for model $model", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + } + ], + "refresh": "10s", + "schemaVersion": 16, + "style": "dark", + "tags": [], + "templating": { + "list": [ + { + "allValue": null, + "current": { + "selected": true, + "text": "All", + "value": "$__all" + }, + "datasource": "Prometheus", + "hide": 0, + "includeAll": true, + "label": null, + "multi": true, + "name": "model", + "options": [], + "query": "label_values(grpc_request_count_total, model_name)", + "refresh": 2, + "regex": "", + "sort": 5, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allValue": null, + "current": { + "$$hashKey": "object:806", + "selected": true, + "text": "All", + "value": "$__all" + }, + "datasource": "Prometheus", + "hide": 0, + "includeAll": true, + "label": null, + "multi": true, + "name": "request_status", + "options": [ + { + "$$hashKey": "object:806", + "selected": true, + "text": "All", + "value": "$__all" + }, + { + "$$hashKey": "object:807", + "selected": false, + "text": "OK", + "value": "OK" + }, + { + "$$hashKey": "object:808", + "selected": false, + "text": "PERMISSION_DENIED", + "value": "PERMISSION_DENIED" + }, + { + "$$hashKey": "object:809", + "selected": false, + "text": "UNAUTHENTICATED", + "value": "UNAUTHENTICATED" + } + ], + "query": "label_values(grpc_request_count_total, status)", + "refresh": 0, + "regex": ".+\\.(.+)", + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + } + ] + }, + "time": { + "from": "now-5m", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "timezone": "", + "title": "XOS", + "uid": "vE-iQRJiz", + "version": 14 +} \ No newline at end of file diff --git a/helm-charts/nem-monitoring/requirements.yaml b/helm-charts/nem-monitoring/requirements.yaml new file mode 100644 index 0000000..a55e7ea --- /dev/null +++ b/helm-charts/nem-monitoring/requirements.yaml @@ -0,0 +1,23 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +dependencies: +- name: prometheus + version: 6.8.1 + repository: https://kubernetes-charts.storage.googleapis.com/ +- name: grafana + version: 1.12.0 + repository: https://kubernetes-charts.storage.googleapis.com/ + diff --git a/helm-charts/nem-monitoring/templates/NOTES.txt b/helm-charts/nem-monitoring/templates/NOTES.txt new file mode 100644 index 0000000..1838249 --- /dev/null +++ b/helm-charts/nem-monitoring/templates/NOTES.txt @@ -0,0 +1,12 @@ +Thank you for installing {{ .Chart.Name }}. + +Your release is named {{ .Release.Name }}. + +You can now access Grafana at: :{{ .Values.grafana.service.nodePort }} +using: + +username: {{ .Values.grafana.adminUser}} +password: {{ .Values.grafana.adminPassword}} + +and Prometheus at: :{{ .Values.prometheus.server.service.nodePort }} + diff --git a/helm-charts/nem-monitoring/templates/exporter-deployment.yaml b/helm-charts/nem-monitoring/templates/exporter-deployment.yaml new file mode 100644 index 0000000..530d952 --- /dev/null +++ b/helm-charts/nem-monitoring/templates/exporter-deployment.yaml @@ -0,0 +1,38 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: kpi-exporter + labels: + release: {{ .Release.Name }} +spec: + replicas: {{ .Values.nem_voltha_kpi_exporter_replicas }} + template: + metadata: + labels: + app: kpi-exporter + release: {{ .Release.Name }} + spec: + containers: + - name: kpi-exporter + image: "{{ .Values.global.registry }}{{ .Values.images.voltha_kpi_exporter.repository }}:{{ tpl .Values.images.voltha_kpi_exporter.tag . }}" + imagePullPolicy: "{{ .Values.images.voltha_kpi_exporter.pullPolicy }}" + args: ["-broker={{ .Values.args.voltha_kpi_broker }}"] + ports: + - containerPort: 8080 + port: 8080 + protocol: TCP diff --git a/helm-charts/nem-monitoring/templates/exporter-service.yaml b/helm-charts/nem-monitoring/templates/exporter-service.yaml new file mode 100644 index 0000000..f5fcee2 --- /dev/null +++ b/helm-charts/nem-monitoring/templates/exporter-service.yaml @@ -0,0 +1,30 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Service +metadata: + name: kpi-exporter + labels: + release: {{ .Release.Name }} +spec: + type: NodePort + ports: + - port: 8080 + targetPort: 8080 + nodePort: {{ .Values.nem_voltha_kpi_exporter_nodePort }} + protocol: TCP + selector: + app: "kpi-exporter" diff --git a/helm-charts/nem-monitoring/templates/grafana-dashboard-kb8s-configmap.yaml b/helm-charts/nem-monitoring/templates/grafana-dashboard-kb8s-configmap.yaml new file mode 100644 index 0000000..3334c51 --- /dev/null +++ b/helm-charts/nem-monitoring/templates/grafana-dashboard-kb8s-configmap.yaml @@ -0,0 +1,24 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana-dashboard-kb8s + labels: + grafana_dashboard: "1" +data: + kb8s.json: | +{{ .Files.Get "grafana-dashboards/kb8s-app-metrics.json" | indent 4 }} \ No newline at end of file diff --git a/helm-charts/nem-monitoring/templates/grafana-dashboard-node-exporter.yaml b/helm-charts/nem-monitoring/templates/grafana-dashboard-node-exporter.yaml new file mode 100644 index 0000000..684f7e3 --- /dev/null +++ b/helm-charts/nem-monitoring/templates/grafana-dashboard-node-exporter.yaml @@ -0,0 +1,24 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana-dashboard-node-exporter + labels: + grafana_dashboard: "1" +data: + xos.json: | +{{ .Files.Get "grafana-dashboards/node-exporter.json" | indent 4 }} diff --git a/helm-charts/nem-monitoring/templates/grafana-dashboard-onos-configmap.yaml b/helm-charts/nem-monitoring/templates/grafana-dashboard-onos-configmap.yaml new file mode 100644 index 0000000..25d270e --- /dev/null +++ b/helm-charts/nem-monitoring/templates/grafana-dashboard-onos-configmap.yaml @@ -0,0 +1,24 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana-dashboard-onos + labels: + grafana_dashboard: "1" +data: + onos.json: | +{{ .Files.Get "grafana-dashboards/onos-kpi.json" | indent 4 }} \ No newline at end of file diff --git a/helm-charts/nem-monitoring/templates/grafana-dashboard-voltha-configmap.yaml b/helm-charts/nem-monitoring/templates/grafana-dashboard-voltha-configmap.yaml new file mode 100644 index 0000000..efbb0dd --- /dev/null +++ b/helm-charts/nem-monitoring/templates/grafana-dashboard-voltha-configmap.yaml @@ -0,0 +1,24 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana-dashboard-voltha + labels: + grafana_dashboard: "1" +data: + voltha.json: | +{{ .Files.Get "grafana-dashboards/voltha-kpi.json" | indent 4 }} \ No newline at end of file diff --git a/helm-charts/nem-monitoring/templates/grafana-dashboard-xos-configmap.yaml b/helm-charts/nem-monitoring/templates/grafana-dashboard-xos-configmap.yaml new file mode 100644 index 0000000..13b99ef --- /dev/null +++ b/helm-charts/nem-monitoring/templates/grafana-dashboard-xos-configmap.yaml @@ -0,0 +1,24 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana-dashboard-xos + labels: + grafana_dashboard: "1" +data: + xos.json: | +{{ .Files.Get "grafana-dashboards/xos.json" | indent 4 }} \ No newline at end of file diff --git a/helm-charts/nem-monitoring/values.yaml b/helm-charts/nem-monitoring/values.yaml new file mode 100644 index 0000000..a41343b --- /dev/null +++ b/helm-charts/nem-monitoring/values.yaml @@ -0,0 +1,232 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +global: + registry: '' + +images: + voltha_kpi_exporter: + repository: 'opencord/kafka-topic-exporter' + tag: '1.1.2' + pullPolicy: 'Always' + +nem_voltha_kpi_exporter_nodePort: 31080 +nem_voltha_kpi_exporter_replicas: 2 + +args: + voltha_kpi_broker: cord-kafka:9092 + +prometheus: + alertmanager: + persistentVolume: + enabled: false + nodeExporter: + service: + clusterIP: "" + server: + persistentVolume: + enabled: false + service: + type: NodePort + nodePort: 31301 + serverFiles: + alerts: {} + rules: {} + + prometheus.yml: + rule_files: + - /etc/config/rules + - /etc/config/alerts + + scrape_configs: + # voltha KPI + - job_name: 'voltha-kpi' + metrics_path: /metrics + scrape_interval: 15s + static_configs: + - targets: + - kpi-exporter:8080 + + # XOS-Core + - job_name: 'xos-core' + metrics_path: /metrics + scrape_interval: 15s + static_configs: + - targets: + - xos-core-prometheus:8000 + + # NodeExporter + - job_name: 'node-exporter' + metrics_path: /metrics + scrape_interval: 15s + static_configs: + - targets: + - nem-monitoring-prometheus-node-exporter:9100 + + # KB8s monitoring jobs + - job_name: prometheus + static_configs: + - targets: + - localhost:9090 + - job_name: 'kubernetes-apiservers' + kubernetes_sd_configs: + - role: endpoints + scheme: https + tls_config: + ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt + insecure_skip_verify: true + bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token + relabel_configs: + - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name] + action: keep + regex: default;kubernetes;https + - job_name: 'kubernetes-nodes' + # Default to scraping over https. If required, just disable this or change to + # `http`. + scheme: https + tls_config: + ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt + insecure_skip_verify: true + bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token + kubernetes_sd_configs: + - role: node + relabel_configs: + - action: labelmap + regex: __meta_kubernetes_node_label_(.+) + - target_label: __address__ + replacement: kubernetes.default.svc:443 + - source_labels: [__meta_kubernetes_node_name] + regex: (.+) + target_label: __metrics_path__ + replacement: /api/v1/nodes/${1}/proxy/metrics + - job_name: 'kubernetes-nodes-cadvisor' + scheme: https + tls_config: + ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt + insecure_skip_verify: true + bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token + kubernetes_sd_configs: + - role: node + relabel_configs: + - action: labelmap + regex: __meta_kubernetes_node_label_(.+) + - target_label: __address__ + replacement: kubernetes.default.svc:443 + - source_labels: [__meta_kubernetes_node_name] + regex: (.+) + target_label: __metrics_path__ + replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor + - job_name: 'kubernetes-service-endpoints' + kubernetes_sd_configs: + - role: endpoints + relabel_configs: + - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape] + action: keep + regex: true + - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme] + action: replace + target_label: __scheme__ + regex: (https?) + - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path] + action: replace + target_label: __metrics_path__ + regex: (.+) + - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port] + action: replace + target_label: __address__ + regex: ([^:]+)(?::\d+)?;(\d+) + replacement: $1:$2 + - action: labelmap + regex: __meta_kubernetes_service_label_(.+) + - source_labels: [__meta_kubernetes_namespace] + action: replace + target_label: kubernetes_namespace + - source_labels: [__meta_kubernetes_service_name] + action: replace + target_label: kubernetes_name + - job_name: 'prometheus-pushgateway' + honor_labels: true + kubernetes_sd_configs: + - role: service + relabel_configs: + - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_probe] + action: keep + regex: pushgateway + - job_name: 'kubernetes-services' + metrics_path: /probe + params: + module: [http_2xx] + kubernetes_sd_configs: + - role: service + relabel_configs: + - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_probe] + action: keep + regex: true + - source_labels: [__address__] + target_label: __param_target + - target_label: __address__ + replacement: blackbox + - source_labels: [__param_target] + target_label: instance + - action: labelmap + regex: __meta_kubernetes_service_label_(.+) + - source_labels: [__meta_kubernetes_namespace] + target_label: kubernetes_namespace + - source_labels: [__meta_kubernetes_service_name] + target_label: kubernetes_name + - job_name: 'kubernetes-pods' + kubernetes_sd_configs: + - role: pod + relabel_configs: + - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape] + action: keep + regex: true + - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path] + action: replace + target_label: __metrics_path__ + regex: (.+) + - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port] + action: replace + regex: ([^:]+)(?::\d+)?;(\d+) + replacement: $1:$2 + target_label: __address__ + - action: labelmap + regex: __meta_kubernetes_pod_label_(.+) + - source_labels: [__meta_kubernetes_namespace] + action: replace + target_label: kubernetes_namespace + - source_labels: [__meta_kubernetes_pod_name] + action: replace + target_label: kubernetes_pod_name + +grafana: + adminUser: admin + adminPassword: strongpassword + service: + type: NodePort + nodePort: 31300 + sidecar: + dashboards: + enabled: true + label: grafana_dashboard + datasources: + datasources.yaml: + apiVersion: 1 + datasources: + - name: Prometheus + type: prometheus + url: http://nem-monitoring-prometheus-server.default.svc.cluster.local + access: proxy + isDefault: true diff --git a/helm-charts/onos-progran/.helmignore b/helm-charts/onos-progran/.helmignore new file mode 100644 index 0000000..c13e3c8 --- /dev/null +++ b/helm-charts/onos-progran/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj \ No newline at end of file diff --git a/helm-charts/onos-progran/Chart.yaml b/helm-charts/onos-progran/Chart.yaml new file mode 100644 index 0000000..9699169 --- /dev/null +++ b/helm-charts/onos-progran/Chart.yaml @@ -0,0 +1,21 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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: onos-progran +description: ONOS with progran APP +version: 1.2.4 +icon: https://guide.opencord.org/logos/onos.svg +appVersion: 0.1.8 + diff --git a/helm-charts/onos-progran/templates/_helpers.tpl b/helm-charts/onos-progran/templates/_helpers.tpl new file mode 100644 index 0000000..372e3c9 --- /dev/null +++ b/helm-charts/onos-progran/templates/_helpers.tpl @@ -0,0 +1,111 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{/* +Expand the name of the chart. +*/}} +{{- define "onos.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "onos.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "onos.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- define "onos.logCfg" -}} +################################################################################ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +# +################################################################################ + +# Root logger +log4j.rootLogger=INFO, out, json, osgi:*, stdout +log4j.throwableRenderer=org.apache.log4j.OsgiThrowableRenderer + +# CONSOLE appender not used by default +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d{ISO8601} | %-5.5p | %-16.16t | %-32.32c{1} | %X{bundle.id} - %X{bundle.name} - %X{bundle.version} | %m%n + +# File appender +log4j.appender.out=org.apache.log4j.RollingFileAppender +log4j.appender.out.layout=org.apache.log4j.PatternLayout +log4j.appender.out.layout.ConversionPattern=%d{ISO8601} | %-5.5p | %-16.16t | %-32.32c{1} | %X{bundle.id} - %X{bundle.name} - %X{bundle.version} | %m%n +log4j.appender.out.file=${karaf.data}/log/karaf.log +log4j.appender.out.append=true +log4j.appender.out.maxFileSize=10MB +log4j.appender.out.maxBackupIndex=10 + +# JSON-ish appender (doesn't handle quotes in fields correctly) +# docs: https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html +log4j.appender.json=org.apache.log4j.RollingFileAppender +log4j.appender.json.layout=org.apache.log4j.PatternLayout +log4j.appender.json.layout.ConversionPattern={"@timestamp":"%d{yyyy-MM-dd'T'HH:mm:ss.SSS'Z'}","levelname":"%p","threadName":"%t","category":"%c{1}","bundle.id":"%X{bundle.id}","bundle.name":"%X{bundle.name}","bundle.version":"%X{bundle.version}","message":"%m"}%n +log4j.appender.json.file=${karaf.data}/log/karaf_json.log +log4j.appender.json.append=true +log4j.appender.json.maxFileSize=10MB +log4j.appender.json.maxBackupIndex=10 + +# Sift appender - one logfile per bundle ID +log4j.appender.sift=org.apache.log4j.sift.MDCSiftingAppender +log4j.appender.sift.key=bundle.name +log4j.appender.sift.default=karaf +log4j.appender.sift.appender=org.apache.log4j.FileAppender +log4j.appender.sift.appender.layout=org.apache.log4j.PatternLayout +log4j.appender.sift.appender.layout.ConversionPattern=%d{ISO8601} | %-5.5p | %-16.16t | %-32.32c{1} | %m%n +log4j.appender.sift.appender.file=${karaf.data}/log/$\\{bundle.name\\}.log +log4j.appender.sift.appender.append=true + +# Application logs +{{ .Values.application_logs }} + +{{- end -}} + diff --git a/helm-charts/onos-progran/templates/onos-progran-configmap.yaml b/helm-charts/onos-progran/templates/onos-progran-configmap.yaml new file mode 100644 index 0000000..d83ecc8 --- /dev/null +++ b/helm-charts/onos-progran/templates/onos-progran-configmap.yaml @@ -0,0 +1,22 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: onos-progran +data: + logCfg: | +{{ include "onos.logCfg" . | indent 4 }} diff --git a/helm-charts/onos-progran/templates/onos-progran-debugger-service.yaml b/helm-charts/onos-progran/templates/onos-progran-debugger-service.yaml new file mode 100644 index 0000000..f3cce87 --- /dev/null +++ b/helm-charts/onos-progran/templates/onos-progran-debugger-service.yaml @@ -0,0 +1,33 @@ +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Service +metadata: + name: {{ template "onos.fullname" . }}-debugger + namespace: {{ .Values.namespace }} + labels: + app: {{ template "onos.name" . }} + chart: {{ template "onos.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + type: {{ .Values.services.debuggerServiceType }} + ports: + - name: debugger +{{ toYaml .Values.services.debugger | indent 4 }} + selector: + app: {{ template "onos.name" . }} + release: {{ .Release.Name }} + diff --git a/helm-charts/onos-progran/templates/onos-progran-deployment.yaml b/helm-charts/onos-progran/templates/onos-progran-deployment.yaml new file mode 100644 index 0000000..9e30bce --- /dev/null +++ b/helm-charts/onos-progran/templates/onos-progran-deployment.yaml @@ -0,0 +1,140 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: apps/v1beta2 +kind: Deployment +metadata: + name: {{ template "onos.fullname" . }} + namespace: {{ .Values.namespace }} + labels: + app: {{ template "onos.name" . }} + chart: {{ template "onos.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +{{- if .Values.xos_service_label }} + xos_service: {{ .Values.xos_service_label }} +{{- end }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + app: {{ template "onos.name" . }} + release: {{ .Release.Name }} + template: + metadata: + labels: + app: {{ template "onos.name" . }} + release: {{ .Release.Name }} +{{- if .Values.xos_service_label }} + xos_service: {{ .Values.xos_service_label }} +{{- end }} + spec: + serviceAccount: {{ .Values.serviceAccountName }} + serviceAccountName: {{ .Values.serviceAccountName }} + containers: + - name: {{ .Chart.Name }} + image: "{{ .Values.global.registry }}{{ .Values.images.onos.repository }}:{{ tpl .Values.images.onos.tag . }}" + imagePullPolicy: {{ .Values.images.onos.pullPolicy }} + command: ["./root/files/onos-1.7.0.cemturker/bin/onos-service", "server", "debug"] + env: +{{ toYaml .Values.onos_env | indent 12 }} + ports: + - name: ovsdb + containerPort: {{ .Values.services.ovsdb.port }} + - name: openflow + containerPort: {{ .Values.services.openflow.port }} + - name: ssh + containerPort: {{ .Values.services.ssh.port }} + - name: ui + containerPort: {{ .Values.services.ui.port }} + - name: cluster + containerPort: {{ .Values.services.cluster.port }} + - name: debugger + containerPort: {{ .Values.services.debugger.port }} + - name: port22 + containerPort: {{ .Values.services.port22.port }} + - name: port9876 + containerPort: {{ .Values.services.port9876.port }} + - name: port4010 + containerPort: {{ .Values.services.port4010.port }} + resources: +{{ toYaml .Values.resources | indent 12 }} + volumeMounts: + - name: node-key + mountPath: /root/vtn + readOnly: true + - name: onos-logs-cfg + mountPath: /root/onos/apache-karaf-3.0.8/etc/org.ops4j.pax.logging.cfg + subPath: org.ops4j.pax.logging.cfg + - name: onos-logs + mountPath: /root/onos/apache-karaf-3.0.8/data/log +{{- if .Values.log_agent.enabled }} + - name: {{ .Chart.Name }}-log-agent + image: "{{ .Values.global.registry }}{{ .Values.images.log_agent.repository }}:{{ .Values.images.log_agent.tag }}" + imagePullPolicy: {{ .Values.images.log_agent.pullPolicy }} + args: [ "-c", "/conf/filebeat.yml", "-e" ] + env: + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: NODE_NAME + valueFrom: + fieldRef: + fieldPath: spec.nodeName + volumeMounts: + - name: onos-logs + mountPath: /onos_logs + - name: log-agent-configmap-volume + mountPath: /conf +{{- end }} + volumes: + - name: node-key + secret: + secretName: node-key + defaultMode: 256 + optional: true + - name: onos-logs-cfg + configMap: + name: onos-progran + items: + - key: logCfg + path: org.ops4j.pax.logging.cfg + - name: onos-logs + emptyDir: {} +{{- if .Values.log_agent.enabled }} + - name: log-agent-configmap-volume + configMap: + name: log-agent-configmap + items: + - key: config + path: filebeat.yml +{{- end }} +{{- with .Values.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} +{{- if .Values.log_agent.enabled }} +{{- include "onos.log-agent-configmap" . }} +{{- end }} + diff --git a/helm-charts/onos-progran/templates/onos-progran-log-agent-configmap.yaml b/helm-charts/onos-progran/templates/onos-progran-log-agent-configmap.yaml new file mode 100644 index 0000000..e94bf33 --- /dev/null +++ b/helm-charts/onos-progran/templates/onos-progran-log-agent-configmap.yaml @@ -0,0 +1,52 @@ +{{- /* +Copyright 2017-present Open Networking Foundation + +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. +*/ -}} +{{- define "onos.log-agent-configmap" }} +--- +kind: ConfigMap +apiVersion: v1 +metadata: + name: log-agent-configmap +data: + config: | + --- + # filebeat configuration for ONOS + filebeat.inputs: + - type: log + paths: + - "/onos_logs/karaf_json.log" + + fields_under_root: true + + json.keys_under_root: true + json.add_error_key: true + json.overwrite_keys: true + json.message_key: "message" + + multiline.pattern: '^[[:space:]]' + multiline.negate: false + multiline.match: after + + # remove unneeded fields + processors: + - drop_fields: + fields: ["host", "prospector", "input"] + + output.kafka: + hosts: {{ .Values.log_agent.kafka_brokers | toJson }} + topic: 'onos.log' + key: '%{[bundle.name]}' + +{{- end }} diff --git a/helm-charts/onos-progran/templates/onos-progran-openflow-service.yaml b/helm-charts/onos-progran/templates/onos-progran-openflow-service.yaml new file mode 100644 index 0000000..1328acc --- /dev/null +++ b/helm-charts/onos-progran/templates/onos-progran-openflow-service.yaml @@ -0,0 +1,33 @@ +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Service +metadata: + name: {{ template "onos.fullname" . }}-openflow + namespace: {{ .Values.namespace }} + labels: + app: {{ template "onos.name" . }} + chart: {{ template "onos.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + type: {{ .Values.services.openflowServiceType }} + ports: + - name: openflow +{{ toYaml .Values.services.openflow | indent 4 }} + selector: + app: {{ template "onos.name" . }} + release: {{ .Release.Name }} + diff --git a/helm-charts/onos-progran/templates/onos-progran-ovsdb-service.yaml b/helm-charts/onos-progran/templates/onos-progran-ovsdb-service.yaml new file mode 100644 index 0000000..52c5c86 --- /dev/null +++ b/helm-charts/onos-progran/templates/onos-progran-ovsdb-service.yaml @@ -0,0 +1,33 @@ +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Service +metadata: + name: {{ template "onos.fullname" . }}-ovsdb + namespace: {{ .Values.namespace }} + labels: + app: {{ template "onos.name" . }} + chart: {{ template "onos.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + type: {{ .Values.services.ovsdbServiceType }} + ports: + - name: ovsdb +{{ toYaml .Values.services.ovsdb | indent 4 }} + selector: + app: {{ template "onos.name" . }} + release: {{ .Release.Name }} + diff --git a/helm-charts/onos-progran/templates/onos-progran-port22-service.yaml b/helm-charts/onos-progran/templates/onos-progran-port22-service.yaml new file mode 100644 index 0000000..a99fbda --- /dev/null +++ b/helm-charts/onos-progran/templates/onos-progran-port22-service.yaml @@ -0,0 +1,33 @@ +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Service +metadata: + name: {{ template "onos.fullname" . }}-progran-port22 + namespace: {{ .Values.namespace }} + labels: + app: {{ template "onos.name" . }} + chart: {{ template "onos.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + type: {{ .Values.services.progranPort22ServiceType }} + ports: + - name: port22 +{{ toYaml .Values.services.port22 | indent 4 }} + selector: + app: {{ template "onos.name" . }} + release: {{ .Release.Name }} + diff --git a/helm-charts/onos-progran/templates/onos-progran-port4010-service.yaml b/helm-charts/onos-progran/templates/onos-progran-port4010-service.yaml new file mode 100644 index 0000000..6547b7c --- /dev/null +++ b/helm-charts/onos-progran/templates/onos-progran-port4010-service.yaml @@ -0,0 +1,33 @@ +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Service +metadata: + name: {{ template "onos.fullname" . }}-progran-port4010 + namespace: {{ .Values.namespace }} + labels: + app: {{ template "onos.name" . }} + chart: {{ template "onos.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + type: {{ .Values.services.progranPort4010ServiceType }} + ports: + - name: port4010 +{{ toYaml .Values.services.port4010 | indent 4 }} + selector: + app: {{ template "onos.name" . }} + release: {{ .Release.Name }} + diff --git a/helm-charts/onos-progran/templates/onos-progran-port9876-service.yaml b/helm-charts/onos-progran/templates/onos-progran-port9876-service.yaml new file mode 100644 index 0000000..5eadee3 --- /dev/null +++ b/helm-charts/onos-progran/templates/onos-progran-port9876-service.yaml @@ -0,0 +1,33 @@ +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Service +metadata: + name: {{ template "onos.fullname" . }}-progran-port9876 + namespace: {{ .Values.namespace }} + labels: + app: {{ template "onos.name" . }} + chart: {{ template "onos.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + type: {{ .Values.services.progranPort9876ServiceType }} + ports: + - name: port9876 +{{ toYaml .Values.services.port9876 | indent 4 }} + selector: + app: {{ template "onos.name" . }} + release: {{ .Release.Name }} + diff --git a/helm-charts/onos-progran/templates/onos-progran-ssh-service.yaml b/helm-charts/onos-progran/templates/onos-progran-ssh-service.yaml new file mode 100644 index 0000000..1af1e16 --- /dev/null +++ b/helm-charts/onos-progran/templates/onos-progran-ssh-service.yaml @@ -0,0 +1,33 @@ +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Service +metadata: + name: {{ template "onos.fullname" . }}-ssh + namespace: {{ .Values.namespace }} + labels: + app: {{ template "onos.name" . }} + chart: {{ template "onos.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + type: {{ .Values.services.sshServiceType }} + ports: + - name: ssh +{{ toYaml .Values.services.ssh | indent 4 }} + selector: + app: {{ template "onos.name" . }} + release: {{ .Release.Name }} + diff --git a/helm-charts/onos-progran/templates/onos-progran-ui-service.yaml b/helm-charts/onos-progran/templates/onos-progran-ui-service.yaml new file mode 100644 index 0000000..fd6274e --- /dev/null +++ b/helm-charts/onos-progran/templates/onos-progran-ui-service.yaml @@ -0,0 +1,33 @@ +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Service +metadata: + name: {{ template "onos.fullname" . }}-ui + namespace: {{ .Values.namespace }} + labels: + app: {{ template "onos.name" . }} + chart: {{ template "onos.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + type: {{ .Values.services.uiServiceType }} + ports: + - name: ui +{{ toYaml .Values.services.ui | indent 4 }} + selector: + app: {{ template "onos.name" . }} + release: {{ .Release.Name }} + diff --git a/helm-charts/onos-progran/values.yaml b/helm-charts/onos-progran/values.yaml new file mode 100644 index 0000000..7b9f813 --- /dev/null +++ b/helm-charts/onos-progran/values.yaml @@ -0,0 +1,113 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Default values for ONOS +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +images: + onos: + repository: 'muluder/prograncontrollermcord' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + + # keep in sync with: https://github.com/helm/charts/blob/master/stable/filebeat/values.yaml + log_agent: + repository: docker.elastic.co/beats/filebeat-oss + tag: 6.4.2 + pullPolicy: IfNotPresent + +global: + registry: '' + +log_agent: + enabled: True + kafka_brokers: ['cord-kafka:9092'] + +nameOverride: '' +fullnameOverride: '' + +xos_service_label: ONOS + +namespace: default +serviceAccountName: default + +services: + openflowServiceType: NodePort + openflow: + port: 6653 + nodePort: 31654 + + sshServiceType: NodePort + ssh: + port: 8101 + nodePort: 30116 + + uiServiceType: NodePort + ui: + port: 8181 + nodePort: 30121 + + debuggerServiceType: NodePort + debugger: + port: 5005 + nodePort: 30556 + + progranPort22ServiceType: NodePort + port22: + port: 22 + nodePort: 30022 + + progranPort9876ServiceType: NodePort + port9876: + port: 9876 + nodePort: 30876 + + progranPort4010ServiceType: NodePort + port4010: + port: 4010 + nodePort: 30410 + + ovsdbServiceType: ClusterIP + ovsdb: + port: 6640 + + cluster: + port: 9876 + +onos_env: +- name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP +- name: NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace +- name: ONOS_APPS + value: "drivers,openflow-base,progran" + +resources: {} + +nodeSelector: {} + +tolerations: [] + +affinity: {} + +application_logs: '' + diff --git a/helm-charts/onos/.helmignore b/helm-charts/onos/.helmignore new file mode 100644 index 0000000..f0c1319 --- /dev/null +++ b/helm-charts/onos/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/helm-charts/onos/Chart.yaml b/helm-charts/onos/Chart.yaml new file mode 100644 index 0000000..2d674f1 --- /dev/null +++ b/helm-charts/onos/Chart.yaml @@ -0,0 +1,20 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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: onos +description: Open Network Operating System +version: 1.1.0 +icon: https://guide.opencord.org/logos/onos.svg +appVersion: 1.13.5 diff --git a/helm-charts/onos/templates/_helpers.tpl b/helm-charts/onos/templates/_helpers.tpl new file mode 100644 index 0000000..1dab05a --- /dev/null +++ b/helm-charts/onos/templates/_helpers.tpl @@ -0,0 +1,110 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{/* +Expand the name of the chart. +*/}} +{{- define "onos.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "onos.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "onos.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- define "onos.logCfg" -}} +################################################################################ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +# +################################################################################ + +# Root logger +log4j.rootLogger=INFO, out, json, osgi:*, stdout +log4j.throwableRenderer=org.apache.log4j.OsgiThrowableRenderer + +# CONSOLE appender not used by default +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d{ISO8601} | %-5.5p | %-16.16t | %-32.32c{1} | %X{bundle.id} - %X{bundle.name} - %X{bundle.version} | %m%n + +# File appender +log4j.appender.out=org.apache.log4j.RollingFileAppender +log4j.appender.out.layout=org.apache.log4j.PatternLayout +log4j.appender.out.layout.ConversionPattern=%d{ISO8601} | %-5.5p | %-16.16t | %-32.32c{1} | %X{bundle.id} - %X{bundle.name} - %X{bundle.version} | %m%n +log4j.appender.out.file=${karaf.data}/log/karaf.log +log4j.appender.out.append=true +log4j.appender.out.maxFileSize=10MB +log4j.appender.out.maxBackupIndex=10 + +# JSON-ish appender (doesn't handle quotes in fields correctly) +# docs: https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html +log4j.appender.json=org.apache.log4j.RollingFileAppender +log4j.appender.json.layout=org.apache.log4j.PatternLayout +log4j.appender.json.layout.ConversionPattern={"@timestamp":"%d{yyyy-MM-dd'T'HH:mm:ss.SSS'Z'}","levelname":"%p","threadName":"%t","category":"%c{1}","bundle.id":"%X{bundle.id}","bundle.name":"%X{bundle.name}","bundle.version":"%X{bundle.version}","message":"%m"}%n +log4j.appender.json.file=${karaf.data}/log/karaf_json.log +log4j.appender.json.append=true +log4j.appender.json.maxFileSize=10MB +log4j.appender.json.maxBackupIndex=10 + +# Sift appender - one logfile per bundle ID +log4j.appender.sift=org.apache.log4j.sift.MDCSiftingAppender +log4j.appender.sift.key=bundle.name +log4j.appender.sift.default=karaf +log4j.appender.sift.appender=org.apache.log4j.FileAppender +log4j.appender.sift.appender.layout=org.apache.log4j.PatternLayout +log4j.appender.sift.appender.layout.ConversionPattern=%d{ISO8601} | %-5.5p | %-16.16t | %-32.32c{1} | %m%n +log4j.appender.sift.appender.file=${karaf.data}/log/$\\{bundle.name\\}.log +log4j.appender.sift.appender.append=true + +# Application logs +{{ .Values.application_logs }} + +{{- end -}} diff --git a/helm-charts/onos/templates/configmap.yaml b/helm-charts/onos/templates/configmap.yaml new file mode 100644 index 0000000..0aaec49 --- /dev/null +++ b/helm-charts/onos/templates/configmap.yaml @@ -0,0 +1,22 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: onos +data: + logCfg: | +{{ include "onos.logCfg" . | indent 4 }} \ No newline at end of file diff --git a/helm-charts/onos/templates/debugger-service.yaml b/helm-charts/onos/templates/debugger-service.yaml new file mode 100644 index 0000000..79f266b --- /dev/null +++ b/helm-charts/onos/templates/debugger-service.yaml @@ -0,0 +1,32 @@ +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Service +metadata: + name: {{ template "onos.fullname" . }}-debugger + namespace: {{ .Values.namespace }} + labels: + app: {{ template "onos.name" . }} + chart: {{ template "onos.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + type: {{ .Values.services.debuggerServiceType }} + ports: + - name: debugger +{{ toYaml .Values.services.debugger | indent 4 }} + selector: + app: {{ template "onos.name" . }} + release: {{ .Release.Name }} diff --git a/helm-charts/onos/templates/deployment.yaml b/helm-charts/onos/templates/deployment.yaml new file mode 100644 index 0000000..f463c1d --- /dev/null +++ b/helm-charts/onos/templates/deployment.yaml @@ -0,0 +1,133 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: apps/v1beta2 +kind: Deployment +metadata: + name: {{ template "onos.fullname" . }} + namespace: {{ .Values.namespace }} + labels: + app: {{ template "onos.name" . }} + chart: {{ template "onos.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +{{- if .Values.xos_service_label }} + xos_service: {{ .Values.xos_service_label }} +{{- end }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + app: {{ template "onos.name" . }} + release: {{ .Release.Name }} + template: + metadata: + labels: + app: {{ template "onos.name" . }} + release: {{ .Release.Name }} +{{- if .Values.xos_service_label }} + xos_service: {{ .Values.xos_service_label }} +{{- end }} + spec: + serviceAccount: {{ .Values.serviceAccountName }} + serviceAccountName: {{ .Values.serviceAccountName }} + containers: + - name: {{ .Chart.Name }} + image: "{{ .Values.global.registry }}{{ .Values.images.onos.repository }}:{{ tpl .Values.images.onos.tag . }}" + imagePullPolicy: {{ .Values.images.onos.pullPolicy }} + command: ["./bin/onos-service", "server", "debug"] + env: +{{ toYaml .Values.onos_env | indent 12 }} + ports: + - name: ovsdb + containerPort: {{ .Values.services.ovsdb.port }} + - name: openflow + containerPort: {{ .Values.services.openflow.port }} + - name: ssh + containerPort: {{ .Values.services.ssh.port }} + - name: ui + containerPort: {{ .Values.services.ui.port }} + - name: cluster + containerPort: {{ .Values.services.cluster.port }} + - name: debugger + containerPort: {{ .Values.services.debugger.port }} + resources: +{{ toYaml .Values.resources | indent 12 }} + volumeMounts: + - name: node-key + mountPath: /root/vtn + readOnly: true + - name: onos-logs-cfg + mountPath: /root/onos/apache-karaf-3.0.8/etc/org.ops4j.pax.logging.cfg + subPath: org.ops4j.pax.logging.cfg + - name: onos-logs + mountPath: /root/onos/apache-karaf-3.0.8/data/log +{{- if .Values.log_agent.enabled }} + - name: {{ .Chart.Name }}-log-agent + image: "{{ .Values.global.registry }}{{ .Values.images.log_agent.repository }}:{{ .Values.images.log_agent.tag }}" + imagePullPolicy: {{ .Values.images.log_agent.pullPolicy }} + args: [ "-c", "/conf/filebeat.yml", "-e" ] + env: + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: NODE_NAME + valueFrom: + fieldRef: + fieldPath: spec.nodeName + volumeMounts: + - name: onos-logs + mountPath: /onos_logs + - name: log-agent-configmap-volume + mountPath: /conf +{{- end }} + volumes: + - name: node-key + secret: + secretName: node-key + defaultMode: 256 + optional: true + - name: onos-logs-cfg + configMap: + name: onos + items: + - key: logCfg + path: org.ops4j.pax.logging.cfg + - name: onos-logs + emptyDir: {} +{{- if .Values.log_agent.enabled }} + - name: log-agent-configmap-volume + configMap: + name: log-agent-configmap + items: + - key: config + path: filebeat.yml +{{- end }} +{{- with .Values.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} +{{- if .Values.log_agent.enabled }} +{{- include "onos.log-agent-configmap" . }} +{{- end }} diff --git a/helm-charts/onos/templates/log-agent-configmap.yaml b/helm-charts/onos/templates/log-agent-configmap.yaml new file mode 100644 index 0000000..44e2763 --- /dev/null +++ b/helm-charts/onos/templates/log-agent-configmap.yaml @@ -0,0 +1,53 @@ +{{- /* +Copyright 2017-present Open Networking Foundation + +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. +*/ -}} +{{- define "onos.log-agent-configmap" }} +--- +kind: ConfigMap +apiVersion: v1 +metadata: + name: log-agent-configmap +data: + config: | + --- + # filebeat configuration for ONOS + filebeat.inputs: + - type: log + paths: + - "/onos_logs/karaf_json.log" + + fields_under_root: true + + json.keys_under_root: true + json.add_error_key: true + json.overwrite_keys: true + json.message_key: "message" + + multiline.pattern: '^[[:space:]]' + multiline.negate: false + multiline.match: after + + # remove unneeded fields + processors: + - drop_fields: + fields: ["host", "prospector", "input"] + + output.kafka: + hosts: {{ .Values.log_agent.kafka_brokers | toJson }} + topic: 'onos.log' + key: '%{[bundle.name]}' + +{{- end }} + diff --git a/helm-charts/onos/templates/openflow-service.yaml b/helm-charts/onos/templates/openflow-service.yaml new file mode 100644 index 0000000..05fadeb --- /dev/null +++ b/helm-charts/onos/templates/openflow-service.yaml @@ -0,0 +1,32 @@ +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Service +metadata: + name: {{ template "onos.fullname" . }}-openflow + namespace: {{ .Values.namespace }} + labels: + app: {{ template "onos.name" . }} + chart: {{ template "onos.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + type: {{ .Values.services.openflowServiceType }} + ports: + - name: openflow +{{ toYaml .Values.services.openflow | indent 4 }} + selector: + app: {{ template "onos.name" . }} + release: {{ .Release.Name }} diff --git a/helm-charts/onos/templates/ovsdb-service.yaml b/helm-charts/onos/templates/ovsdb-service.yaml new file mode 100644 index 0000000..f0760fe --- /dev/null +++ b/helm-charts/onos/templates/ovsdb-service.yaml @@ -0,0 +1,32 @@ +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Service +metadata: + name: {{ template "onos.fullname" . }}-ovsdb + namespace: {{ .Values.namespace }} + labels: + app: {{ template "onos.name" . }} + chart: {{ template "onos.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + type: {{ .Values.services.ovsdbServiceType }} + ports: + - name: ovsdb +{{ toYaml .Values.services.ovsdb | indent 4 }} + selector: + app: {{ template "onos.name" . }} + release: {{ .Release.Name }} diff --git a/helm-charts/onos/templates/ssh-service.yaml b/helm-charts/onos/templates/ssh-service.yaml new file mode 100644 index 0000000..bf0b8a0 --- /dev/null +++ b/helm-charts/onos/templates/ssh-service.yaml @@ -0,0 +1,32 @@ +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Service +metadata: + name: {{ template "onos.fullname" . }}-ssh + namespace: {{ .Values.namespace }} + labels: + app: {{ template "onos.name" . }} + chart: {{ template "onos.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + type: {{ .Values.services.sshServiceType }} + ports: + - name: ssh +{{ toYaml .Values.services.ssh | indent 4 }} + selector: + app: {{ template "onos.name" . }} + release: {{ .Release.Name }} diff --git a/helm-charts/onos/templates/ui-service.yaml b/helm-charts/onos/templates/ui-service.yaml new file mode 100644 index 0000000..4c05f4d --- /dev/null +++ b/helm-charts/onos/templates/ui-service.yaml @@ -0,0 +1,32 @@ +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Service +metadata: + name: {{ template "onos.fullname" . }}-ui + namespace: {{ .Values.namespace }} + labels: + app: {{ template "onos.name" . }} + chart: {{ template "onos.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + type: {{ .Values.services.uiServiceType }} + ports: + - name: ui +{{ toYaml .Values.services.ui | indent 4 }} + selector: + app: {{ template "onos.name" . }} + release: {{ .Release.Name }} diff --git a/helm-charts/onos/values.yaml b/helm-charts/onos/values.yaml new file mode 100644 index 0000000..9ab6274 --- /dev/null +++ b/helm-charts/onos/values.yaml @@ -0,0 +1,97 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Default values for ONOS +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +images: + onos: + repository: 'onosproject/onos' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + + # keep in sync with: https://github.com/helm/charts/blob/master/stable/filebeat/values.yaml + log_agent: + repository: docker.elastic.co/beats/filebeat-oss + tag: 6.4.2 + pullPolicy: IfNotPresent + +global: + registry: '' + +log_agent: + enabled: True + kafka_brokers: ['cord-kafka:9092'] + +nameOverride: '' +fullnameOverride: '' + +xos_service_label: ONOS + +namespace: default +serviceAccountName: default + +services: + openflowServiceType: NodePort + openflow: + port: 6653 + nodePort: 31653 + + sshServiceType: NodePort + ssh: + port: 8101 + nodePort: 30115 + + uiServiceType: NodePort + ui: + port: 8181 + nodePort: 30120 + + debuggerServiceType: NodePort + debugger: + port: 5005 + nodePort: 30555 + + ovsdbServiceType: ClusterIP + ovsdb: + port: 6640 + + cluster: + port: 9876 + +onos_env: +- name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP +- name: NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace +- name: ONOS_APPS + value: "drivers,openflow-base" + +resources: {} + +nodeSelector: {} + +tolerations: [] + +affinity: {} + +application_logs: '' diff --git a/helm-charts/ovsplugin/Chart.yaml b/helm-charts/ovsplugin/Chart.yaml new file mode 100644 index 0000000..8b1c559 --- /dev/null +++ b/helm-charts/ovsplugin/Chart.yaml @@ -0,0 +1,17 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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: ovsplugin +version: 1.0.0 diff --git a/helm-charts/ovsplugin/templates/_helpers.tpl b/helm-charts/ovsplugin/templates/_helpers.tpl new file mode 100644 index 0000000..f1d1dc2 --- /dev/null +++ b/helm-charts/ovsplugin/templates/_helpers.tpl @@ -0,0 +1,25 @@ + +{{- /* + Copyright 2017-present Open Networking Foundation + + 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. + */ -}} + +{{- define "ovsplugin.release_labels" }} +app: {{ printf "%s-%s" .Release.Name .Chart.Name | trunc 63 }} +version: {{ .Chart.Version }} +release: {{ .Release.Name }} +{{- end }} +{{- define "ovsplugin.full_name" -}} +{{- printf "%s-%s" .Release.Name .Chart.Name | trunc 63 -}} +{{- end -}} diff --git a/helm-charts/ovsplugin/templates/ovs-cni.yaml b/helm-charts/ovsplugin/templates/ovs-cni.yaml new file mode 100644 index 0000000..26ed2ba --- /dev/null +++ b/helm-charts/ovsplugin/templates/ovs-cni.yaml @@ -0,0 +1,206 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +kind: ClusterRole +apiVersion: rbac.authorization.k8s.io/v1beta1 +metadata: + name: ovs-plugin +rules: + - apiGroups: + - "" + resources: + - pods + verbs: + - get + - update + - patch + - apiGroups: + - "alpha.network.k8s.io" + resources: + - logicalnetworks + verbs: + - get + - update + - patch + - apiGroups: + - "alpha.network.k8s.io" + resources: + - physicalnetworks + verbs: + - get + - update + - patch + - apiGroups: + - "" + resources: + - configmaps + verbs: + - get + - apiGroups: + - "admissionregistration.k8s.io" + resources: + - validatingwebhookconfigurations + verbs: + - get + - update + - create + - delete + +--- +kind: ClusterRoleBinding +apiVersion: rbac.authorization.k8s.io/v1beta1 +metadata: + name: ovs-plugin +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: ovs-plugin +subjects: +- kind: ServiceAccount + name: ovs-plugin + namespace: kube-system +- kind: Group + name: system:authenticated + apiGroup: rbac.authorization.k8s.io + +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: ovs-plugin + namespace: kube-system + +--- +# This ConfigMap can be used to configure a self-hosted OVS installation. +kind: ConfigMap +apiVersion: v1 +metadata: + name: ovs-config + namespace: kube-system +data: + # The CNI network configuration to install on each node. + cni_ovs_network_config: |- + { + "name":"ovs", + "cniVersion":"0.3.1", + "type":"ovs", + "ovsBridge":"br0", + "vtepIPs":[ + "10.245.2.2", + "10.245.2.3" + ], + "isDefaultGateway": true, + "ipMasq": true, + "ipam":{ + "type":"host-local", + "subnet":"10.244.0.0/16", + "rangeStart":"10.244.1.10", + "rangeEnd":"10.244.1.150", + "routes":[ + { + "dst":"0.0.0.0/0" + } + ], + "gateway":"10.244.1.1" + } + } + + cni_ovsctlip_network_config: |- + { + "name":"ovs-ctl", + "cniVersion":"0.3.1", + "type":"ovs", + "ovsBridge":"br0", + "ipam":{ + "type":"centralip", + "ipType": "cluster", + "network":"10.245.0.0/16", + "etcdURL": "https://127.0.0.1:2379", + "etcdCertFile": "/etc/ovs/certs/cert.crt", + "etcdKeyFile": "/etc/ovs/certs/key.pem", + "etcdTrustedCAFileFile": "/etc/ovs/certs/ca_cert.crt" + } + } + + +--- +# Install OVS CNI plugin and conf on each slave node. +kind: DaemonSet +apiVersion: extensions/v1beta1 +metadata: + name: ovs-plugin + namespace: kube-system + labels: + k8s-app: ovs +spec: + selector: + matchLabels: + k8s-app: ovs + template: + metadata: + labels: + k8s-app: ovs + annotations: + scheduler.alpha.kubernetes.io/critical-pod: '' + scheduler.alpha.kubernetes.io/tolerations: | + [ + { + "key": "dedicated", + "value": "master", + "effect": "NoSchedule" + }, + { + "key": "CriticalAddonsOnly", + "operator": "Exists" + } + ] + spec: + hostNetwork: true + hostPID: true + serviceAccountName: ovs-plugin + containers: + # Create a container with place_conf.sh that + # Installs required 30-ovs.conf and 35-ovsctlip.conf on slave node. + - name: install-cni + image: {{ .Values.pull_docker_registry }}{{ .Values.images.ovs_plugin.repository }}:{{ .Values.images.ovs_plugin.tag }} + imagePullPolicy: {{ .Values.images.ovs_plugin.pullPolicy }} + command: ["/place_conf.sh"] + env: + - name: CNI_OVS_NETWORK_CONFIG + valueFrom: + configMapKeyRef: + name: ovs-config + key: cni_ovs_network_config + - name: CNI_OVSCTLIP_NETWORK_CONFIG + valueFrom: + configMapKeyRef: + name: ovs-config + key: cni_ovsctlip_network_config + - name: KUBERNETES_NODE_NAME + valueFrom: + fieldRef: + fieldPath: spec.nodeName + volumeMounts: + - mountPath: /host/opt/cni/bin + name: cni-bin-dir + - mountPath: /host/etc/cni/net.d + name: cni-net-dir + volumes: + - name: cni-bin-dir + hostPath: + path: /opt/cni/bin + - name: cni-net-dir + hostPath: + path: /etc/cni/net.d diff --git a/helm-charts/ovsplugin/values.yaml b/helm-charts/ovsplugin/values.yaml new file mode 100644 index 0000000..813a19a --- /dev/null +++ b/helm-charts/ovsplugin/values.yaml @@ -0,0 +1,23 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +pull_docker_registry: + +images: + ovs_plugin: + repository: gopinatht/ovs-plugin-installer + tag: 'latest' + pullPolicy: 'Always' + diff --git a/helm-charts/ponnet/Chart.yaml b/helm-charts/ponnet/Chart.yaml new file mode 100644 index 0000000..d9ee22f --- /dev/null +++ b/helm-charts/ponnet/Chart.yaml @@ -0,0 +1,17 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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: ponnet +version: 1.0.0 diff --git a/helm-charts/ponnet/templates/_helpers.tpl b/helm-charts/ponnet/templates/_helpers.tpl new file mode 100644 index 0000000..7ce70d5 --- /dev/null +++ b/helm-charts/ponnet/templates/_helpers.tpl @@ -0,0 +1,25 @@ + +{{- /* + Copyright 2017-present Open Networking Foundation + + 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. + */ -}} + +{{- define "ponnet.release_labels" }} +app: {{ printf "%s-%s" .Release.Name .Chart.Name | trunc 63 }} +version: {{ .Chart.Version }} +release: {{ .Release.Name }} +{{- end }} +{{- define "ponnet.full_name" -}} +{{- printf "%s-%s" .Release.Name .Chart.Name | trunc 63 -}} +{{- end -}} diff --git a/helm-charts/ponnet/templates/genie-cni-1.8.yaml b/helm-charts/ponnet/templates/genie-cni-1.8.yaml new file mode 100644 index 0000000..0fbf50a --- /dev/null +++ b/helm-charts/ponnet/templates/genie-cni-1.8.yaml @@ -0,0 +1,328 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. +--- +kind: ClusterRole +apiVersion: rbac.authorization.k8s.io/v1beta1 +metadata: + name: genie-plugin +rules: + - apiGroups: + - "" + resources: + - pods + verbs: + - get + - update + - patch + - apiGroups: + - "alpha.network.k8s.io" + resources: + - logicalnetworks + verbs: + - get + - update + - patch + - apiGroups: + - "alpha.network.k8s.io" + resources: + - physicalnetworks + verbs: + - get + - update + - patch + - apiGroups: + - "" + resources: + - configmaps + verbs: + - get + - apiGroups: + - "admissionregistration.k8s.io" + resources: + - validatingwebhookconfigurations + verbs: + - get + - update + - create + - delete + +--- +kind: ClusterRole +apiVersion: rbac.authorization.k8s.io/v1beta1 +metadata: + name: genie-policy +rules: + - apiGroups: + - "" + resources: + - networkpolicies + verbs: + - get + - apiGroups: + - "" + resources: + - namespaces + verbs: + - get + +--- +kind: ClusterRoleBinding +apiVersion: rbac.authorization.k8s.io/v1beta1 +metadata: + name: genie-plugin +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: genie-plugin +subjects: +- kind: ServiceAccount + name: genie-plugin + namespace: kube-system +- kind: ServiceAccount + name: genie-policy + namespace: kube-system +- kind: Group + name: system:authenticated + apiGroup: rbac.authorization.k8s.io + +--- +kind: ClusterRoleBinding +apiVersion: rbac.authorization.k8s.io/v1beta1 +metadata: + name: genie-policy +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: genie-policy +subjects: +- kind: ServiceAccount + name: genie-policy + namespace: kube-system + +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: genie-plugin + namespace: kube-system + +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: genie-policy + namespace: kube-system + +--- +# This ConfigMap can be used to configure a self-hosted CNI-Genie installation. +kind: ConfigMap +apiVersion: v1 +metadata: + name: genie-config + namespace: kube-system +data: + # The CNI network configuration to install on each node. + cni_genie_network_config: |- + { + "name": "k8s-pod-network", + "type": "genie", + "log_level": "info", + "datastore_type": "kubernetes", + "default_plugin": "calico", + "hostname": "__KUBERNETES_NODE_NAME__", + "policy": { + "type": "k8s", + "k8s_auth_token": "__SERVICEACCOUNT_TOKEN__" + }, + "kubernetes": { + "k8s_api_root": "https://__KUBERNETES_SERVICE_HOST__:__KUBERNETES_SERVICE_PORT__", + "kubeconfig": "/etc/cni/net.d/genie-kubeconfig" + }, + "romana_root": "http://__ROMANA_SERVICE_HOST__:__ROMANA_SERVICE_PORT__", + "segment_label_name": "romanaSegment" + } + +--- +# Install CNI-Genie plugin on each slave node. +kind: DaemonSet +apiVersion: extensions/v1beta1 +metadata: + name: genie-plugin + namespace: kube-system + labels: + k8s-app: genie +spec: + selector: + matchLabels: + k8s-app: genie + template: + metadata: + labels: + k8s-app: genie + annotations: + scheduler.alpha.kubernetes.io/critical-pod: '' + scheduler.alpha.kubernetes.io/tolerations: | + [ + { + "key": "dedicated", + "value": "master", + "effect": "NoSchedule" + }, + { + "key": "CriticalAddonsOnly", + "operator": "Exists" + } + ] + spec: + hostNetwork: true + hostPID: true + serviceAccountName: genie-plugin + containers: + # Create a container with install.sh that + # Installs required 00-genie.conf and genie binary + # on slave node. + - name: install-cni + image: quay.io/huawei-cni-genie/genie-plugin:latest + imagePullPolicy: Always + command: ["/launch.sh"] + env: + - name: CNI_NETWORK_CONFIG + valueFrom: + configMapKeyRef: + name: genie-config + key: cni_genie_network_config + - name: KUBERNETES_NODE_NAME + valueFrom: + fieldRef: + fieldPath: spec.nodeName + volumeMounts: + - mountPath: /host/opt/cni/bin + name: cni-bin-dir + - mountPath: /host/etc/cni/net.d + name: cni-net-dir + volumes: + - name: cni-bin-dir + hostPath: + path: /opt/cni/bin + - name: cni-net-dir + hostPath: + path: /etc/cni/net.d + +--- +# Genie network admission controller daemonset configuration +# Genie network admission controller pods will run only in master nodes +apiVersion: extensions/v1beta1 +kind: DaemonSet +metadata: + name: genie-network-admission-controller + namespace: kube-system +spec: + template: + metadata: + labels: + role: genie-network-admission-controller + annotations: + scheduler.alpha.kubernetes.io/critical-pod: '' + spec: + tolerations: + - key: node-role.kubernetes.io/master + effect: NoSchedule + - key: CriticalAddonsOnly + operator: Exists + nodeSelector: + node-role.kubernetes.io/master: "" + hostNetwork: true + serviceAccountName: genie-plugin + containers: + - name: genie-network-admission-controller + image: quay.io/huawei-cni-genie/genie-admission-controller:latest + imagePullPolicy: Always + ports: + - containerPort: 8000 +--- +# Genie network admission controller service +apiVersion: v1 +kind: Service +metadata: + labels: + role: genie-network-admission-controller + name: genie-network-admission-controller + namespace: kube-system +spec: + ports: + - port: 443 + targetPort: 8000 + selector: + role: genie-network-admission-controller + +--- +# Daemonset configuration for geine network policy +kind: DaemonSet +apiVersion: extensions/v1beta1 +metadata: + name: genie-policy-controller + namespace: kube-system + labels: + k8s-app: genie-policy +spec: + selector: + matchLabels: + k8s-app: genie-policy + template: + metadata: + labels: + k8s-app: genie-policy + annotations: + scheduler.alpha.kubernetes.io/critical-pod: '' + scheduler.alpha.kubernetes.io/tolerations: | + [ + { + "key": "dedicated", + "value": "master", + "effect": "NoSchedule" + }, + { + "key": "CriticalAddonsOnly", + "operator": "Exists" + } + ] + spec: + hostNetwork: true + hostPID: true + serviceAccountName: genie-policy + containers: + - name: policy-engine + env: + - name: NODE_NAME + valueFrom: + fieldRef: + fieldPath: spec.nodeName + image: quay.io/huawei-cni-genie/genie-policy-controller:latest + imagePullPolicy: Always + command: + - /genie-policy + args: + - -kubeconfig=/etc/kubernetes/admin.conf + - -logtostderr=true + securityContext: + privileged: true + volumeMounts: + - name: etc-kubernetes + mountPath: /etc/kubernetes + readOnly: true + volumes: + - name: etc-kubernetes + hostPath: + path: /etc/kubernetes \ No newline at end of file diff --git a/helm-charts/ponnet/templates/pon0-cni.yaml b/helm-charts/ponnet/templates/pon0-cni.yaml new file mode 100644 index 0000000..8b23d5a --- /dev/null +++ b/helm-charts/ponnet/templates/pon0-cni.yaml @@ -0,0 +1,200 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +kind: ClusterRole +apiVersion: rbac.authorization.k8s.io/v1beta1 +metadata: + name: pon0-plugin +rules: + - apiGroups: + - "" + resources: + - pods + verbs: + - get + - update + - patch + - apiGroups: + - "alpha.network.k8s.io" + resources: + - logicalnetworks + verbs: + - get + - update + - patch + - apiGroups: + - "alpha.network.k8s.io" + resources: + - physicalnetworks + verbs: + - get + - update + - patch + - apiGroups: + - "" + resources: + - configmaps + verbs: + - get + - apiGroups: + - "admissionregistration.k8s.io" + resources: + - validatingwebhookconfigurations + verbs: + - get + - update + - create + - delete + +--- +kind: ClusterRoleBinding +apiVersion: rbac.authorization.k8s.io/v1beta1 +metadata: + name: pon0-plugin +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: pon0-plugin +subjects: +- kind: ServiceAccount + name: pon0-plugin + namespace: kube-system +- kind: Group + name: system:authenticated + apiGroup: rbac.authorization.k8s.io + +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: pon0-plugin + namespace: kube-system + +--- +# This ConfigMap can be used to configure a self-hosted Pon0 installation. +kind: ConfigMap +apiVersion: v1 +metadata: + name: pon0-config + namespace: kube-system +data: + # The CNI network configuration to install on each node. + cni_pon0_network_config: |- + { + "name": "pon0", + "type": "bridge", + "bridge": "pon0", + "isGateway": false, + "ipMask": false, + "ipam": { + "type": "host-local", + "subnet": "10.22.0.0/16" + } + } + +--- +# This ConfigMap can be used to configure a self-hosted Pon0 installation. +kind: ConfigMap +apiVersion: v1 +metadata: + name: pon1-config + namespace: kube-system +data: + # The CNI network configuration to install on each node. + cni_pon1_network_config: |- + { + "name": "pon1", + "type": "bridge", + "bridge": "pon1", + "isGateway": true, + "ipMask": true, + "ipam": { + "type": "host-local", + "subnet": "10.23.0.0/16", + "routes": [ + { "dst": "0.0.0.0/0" } + ] + } + } + +--- +# Install Pon0 CNI conf on each slave node. +kind: DaemonSet +apiVersion: extensions/v1beta1 +metadata: + name: pon0-plugin + namespace: kube-system + labels: + k8s-app: pon0 +spec: + selector: + matchLabels: + k8s-app: pon0 + template: + metadata: + labels: + k8s-app: pon0 + annotations: + scheduler.alpha.kubernetes.io/critical-pod: '' + scheduler.alpha.kubernetes.io/tolerations: | + [ + { + "key": "dedicated", + "value": "master", + "effect": "NoSchedule" + }, + { + "key": "CriticalAddonsOnly", + "operator": "Exists" + } + ] + spec: + hostNetwork: true + hostPID: true + serviceAccountName: pon0-plugin + containers: + # Create a container with place_conf.sh that + # Installs required 20-pon0.conf on slave node. + - name: install-cni + image: {{ .Values.pull_docker_registry }}{{ .Values.images.pon0.repository }}:{{ .Values.images.pon0.tag }} + imagePullPolicy: {{ .Values.images.pon0.pullPolicy }} + command: ["/place_conf.sh"] + env: + - name: CNI_NETWORK_CONFIG + valueFrom: + configMapKeyRef: + name: pon0-config + key: cni_pon0_network_config + - name: CNI_PON1_NETWORK_CONFIG + valueFrom: + configMapKeyRef: + name: pon1-config + key: cni_pon1_network_config + - name: KUBERNETES_NODE_NAME + valueFrom: + fieldRef: + fieldPath: spec.nodeName + volumeMounts: + - mountPath: /host/opt/cni/bin + name: cni-bin-dir + - mountPath: /host/etc/cni/net.d + name: cni-net-dir + volumes: + - name: cni-bin-dir + hostPath: + path: /opt/cni/bin + - name: cni-net-dir + hostPath: + path: /etc/cni/net.d diff --git a/helm-charts/ponnet/values.yaml b/helm-charts/ponnet/values.yaml new file mode 100644 index 0000000..402fb1f --- /dev/null +++ b/helm-charts/ponnet/values.yaml @@ -0,0 +1,25 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +pull_docker_registry: + +images: + pon0: + repository: gopinatht/pon0-network + tag: 'latest' + pullPolicy: 'Always' + +global: + namespace: voltha diff --git a/helm-charts/ponsimv2/Chart.yaml b/helm-charts/ponsimv2/Chart.yaml new file mode 100644 index 0000000..296e6a1 --- /dev/null +++ b/helm-charts/ponsimv2/Chart.yaml @@ -0,0 +1,23 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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: ponsimv2 +description: PON Simulator +icon: https://guide.opencord.org/logos/cord.svg + +version: 1.0.3 + +# VOLTHA version +appVersion: 1.6.0 diff --git a/helm-charts/ponsimv2/templates/_helpers.tpl b/helm-charts/ponsimv2/templates/_helpers.tpl new file mode 100644 index 0000000..95813d3 --- /dev/null +++ b/helm-charts/ponsimv2/templates/_helpers.tpl @@ -0,0 +1,25 @@ + +{{- /* + Copyright 2017-present Open Networking Foundation + + 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. + */ -}} + +{{- define "ponsimv2.release_labels" }} +app: {{ printf "%s-%s" .Release.Name .Chart.Name | trunc 63 }} +version: {{ .Chart.Version }} +release: {{ .Release.Name }} +{{- end }} +{{- define "ponsimv2.full_name" -}} +{{- printf "%s-%s" .Release.Name .Chart.Name | trunc 63 -}} +{{- end -}} diff --git a/helm-charts/ponsimv2/templates/olt.yaml b/helm-charts/ponsimv2/templates/olt.yaml new file mode 100644 index 0000000..8026068 --- /dev/null +++ b/helm-charts/ponsimv2/templates/olt.yaml @@ -0,0 +1,73 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Service +metadata: + name: olt + namespace: {{ .Values.global.namespace }} + labels: + name: olt +spec: + ports: + - name: grpc + port: 50060 + targetPort: 50060 + selector: + app: olt +--- +apiVersion: apps/v1beta1 +kind: Deployment +metadata: + name: olt + namespace: {{ .Values.global.namespace }} +spec: + replicas: 1 + template: + metadata: + labels: + app: olt + annotations: + cni: "calico,pon1" + spec: + containers: + - name: olt + image: "{{ .Values.global.registry }}{{ .Values.images.olt.repository }}:{{ tpl .Values.images.olt.tag . }}" + imagePullPolicy: {{ .Values.images.olt.pullPolicy }} + env: + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + args: + - "/app/ponsim" + - "-device_type" + - "OLT" + - "-onus" + - "4" + - "-internal_if" + - "eth1" + - "-external_if" + - "eth1" + - "-vcore_endpoint" + - "vcore" + - "-promiscuous" + ports: + - containerPort: 50060 + name: grpc-port diff --git a/helm-charts/ponsimv2/templates/onu.yaml b/helm-charts/ponsimv2/templates/onu.yaml new file mode 100644 index 0000000..6179fc2 --- /dev/null +++ b/helm-charts/ponsimv2/templates/onu.yaml @@ -0,0 +1,86 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Service +metadata: + name: onu + namespace: {{ .Values.global.namespace }} + labels: + name: onu +spec: + ports: + - name: grpc + port: 50061 + targetPort: 50061 + selector: + app: onu +--- +apiVersion: apps/v1beta1 +kind: Deployment +metadata: + name: onu + namespace: {{ .Values.global.namespace }} +spec: + replicas: 1 + template: + metadata: + labels: + app: onu + annotations: + cni: "calico,pon0" + spec: + affinity: + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - weight: 100 + podAffinityTerm: + labelSelector: + matchExpressions: + - key: app + operator: In + values: + - rg + topologyKey: kubernetes.io/hostname + containers: + - name: onu + image: "{{ .Values.global.registry }}{{ .Values.images.onu.repository }}:{{ tpl .Values.images.onu.tag . }}" + imagePullPolicy: {{ .Values.images.onu.pullPolicy }} + env: + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + args: + - "/app/ponsim" + - "-device_type" + - "ONU" + - "-parent_addr" + - "olt" + - "-grpc_port" + - "50061" + - "-internal_if" + - "eth0" + - "-external_if" + - "eth1" + - "-promiscuous" + + ports: + - containerPort: 50061 + name: grpc-port diff --git a/helm-charts/ponsimv2/templates/rg.yaml b/helm-charts/ponsimv2/templates/rg.yaml new file mode 100644 index 0000000..e96c59c --- /dev/null +++ b/helm-charts/ponsimv2/templates/rg.yaml @@ -0,0 +1,57 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: apps/v1beta1 +kind: Deployment +metadata: + name: rg + namespace: {{ .Values.global.namespace }} +spec: + replicas: 1 + template: + metadata: + labels: + app: rg + annotations: + cni: "pon0" + spec: + affinity: + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - weight: 100 + podAffinityTerm: + labelSelector: + matchExpressions: + - key: app + operator: In + values: + - onu + topologyKey: kubernetes.io/hostname + containers: + - name: rg + image: "{{ .Values.global.registry }}{{ .Values.images.rg.repository }}:{{ tpl .Values.images.rg.tag . }}" + imagePullPolicy: {{ .Values.images.rg.pullPolicy }} + env: + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + command: [ "/bin/bash", "-c", "trap : TERM INT; sleep infinity & wait" ] + securityContext: + privileged: true diff --git a/helm-charts/ponsimv2/values.yaml b/helm-charts/ponsimv2/values.yaml new file mode 100644 index 0000000..9fa6c0a --- /dev/null +++ b/helm-charts/ponsimv2/values.yaml @@ -0,0 +1,36 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +images: + olt: + repository: 'voltha/voltha-ponsim' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + onu: + repository: 'voltha/voltha-ponsim' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + rg: + repository: 'voltha/voltha-tester' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + pon0: + repository: 'gopinatht/pon0-network' + tag: 'latest' + pullPolicy: 'Always' + +global: + namespace: voltha + registry: '' diff --git a/helm-charts/sadis-server/Chart.yaml b/helm-charts/sadis-server/Chart.yaml new file mode 100644 index 0000000..c4a24db --- /dev/null +++ b/helm-charts/sadis-server/Chart.yaml @@ -0,0 +1,17 @@ +# Copyright 2017-present Open Networking Foundation +# +# 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: sadis-server +version: 1.0.2 +appVersion: 1.0.1 diff --git a/helm-charts/sadis-server/templates/sadis-deployment.yaml b/helm-charts/sadis-server/templates/sadis-deployment.yaml new file mode 100644 index 0000000..e7de3c8 --- /dev/null +++ b/helm-charts/sadis-server/templates/sadis-deployment.yaml @@ -0,0 +1,48 @@ +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: extensions/v1beta1 + +kind: Deployment +metadata: + name: sadis-server + labels: + app: sadis-server +spec: + replicas: 1 + template: + metadata: + labels: + app: sadis-server + release: {{ .Release.Name }} + spec: + containers: + - name: sadis-server + image: {{ .Values.global.registry }}{{ .Values.image.repository }}:{{ tpl .Values.image.tag . }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + ports: + - containerPort: 8000 + port: 8000 + protocol: TCP + env: + - name: SADISSERVER_PORT + value: "8000" + - name: SADISSERVER_USERNAME + value: "{{ .Values.xosAdminUser }}" + - name: SADISSERVER_PASSWORD + value: "{{ .Values.xosAdminPassword }}" + - name: SADISSERVER_XOS + value: xos-chameleon:9101 + - name: SADISSERVER_KAFKABROKER + value: "{{ .Values.kafkaBroker }}" diff --git a/helm-charts/sadis-server/templates/sadis-service.yaml b/helm-charts/sadis-server/templates/sadis-service.yaml new file mode 100644 index 0000000..e31b932 --- /dev/null +++ b/helm-charts/sadis-server/templates/sadis-service.yaml @@ -0,0 +1,30 @@ +# Copyright 2017-present Open Networking Foundation +# +# 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. +apiVersion: v1 + +kind: Service +metadata: + name: "sadis-service" + labels: + app: "sadis-server" +spec: + type: ClusterIP + ports: + - name: sadis-service + port: 8000 + targetPort: 8000 + protocol: TCP + selector: + app: sadis-server + release: {{ .Release.Name }} diff --git a/helm-charts/sadis-server/values.yaml b/helm-charts/sadis-server/values.yaml new file mode 100644 index 0000000..0aa4cb6 --- /dev/null +++ b/helm-charts/sadis-server/values.yaml @@ -0,0 +1,26 @@ +# Copyright 2017-present Open Networking Foundation +# +# 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. + + +image: + repository: 'opencord/sadis-server' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + +global: + registry: '' + +xosAdminUser: "admin@opencord.org" +xosAdminPassword: "letmein" +kafkaBroker: "cord-kafka:9092" diff --git a/helm-charts/scripts/helmlint.sh b/helm-charts/scripts/helmlint.sh new file mode 100755 index 0000000..aabdca0 --- /dev/null +++ b/helm-charts/scripts/helmlint.sh @@ -0,0 +1,66 @@ +#!/usr/bin/env bash + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# helmlint.sh +# run `helm lint` on all helm charts that are found + +set +e -o pipefail + +# verify that we have helm installed +command -v helm >/dev/null 2>&1 || { echo "helm not found, please install it" >&2; exit 1; } + +echo "helmlint.sh, using helm version: $(helm version -c --short)" + +fail_lint=0 + +# when not running under Jenkins, use current dir as workspace +WORKSPACE=${WORKSPACE:-.} + +# cleanup repos if `clean` option passed as parameter +if [ "$1" = "clean" ] +then + echo "Removing dependent charts" + find "${WORKSPACE}" -name 'charts' -exec rm -rf {} \; +fi + +while IFS= read -r -d '' chart +do + chartdir=$(dirname "${chart}") + + # only update dependencies for profiles + if [[ $chartdir =~ xos-profiles || $chartdir =~ workflows ]] && [ -f "${chartdir}/requirements.yaml" ] + then + helm dependency update "${chartdir}" + fi + + # lint with values.yaml if it exists + if [ -f "${chartdir}/values.yaml" ]; then + helm lint --strict --values "${chartdir}/values.yaml" "${chartdir}" + else + helm lint --strict "${chartdir}" + fi + + rc=$? + if [[ $rc != 0 ]]; then + fail_lint=1 + fi +done < <(find "${WORKSPACE}" -name Chart.yaml -print0) + +if [[ $fail_lint != 0 ]]; then + exit 1 +fi + +exit 0 diff --git a/helm-charts/scripts/helmrepo.sh b/helm-charts/scripts/helmrepo.sh new file mode 100755 index 0000000..3820124 --- /dev/null +++ b/helm-charts/scripts/helmrepo.sh @@ -0,0 +1,47 @@ +#!/usr/bin/env bash + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# helmrepo.sh +# creates a helm repo for publishing on guide website + +set -eu -o pipefail + +# when not running under Jenkins, use current dir as workspace +WORKSPACE=${WORKSPACE:-.} + +REPO_DIR="${REPO_DIR:-chart_repo}" + +GERRIT_BRANCH="${GERRIT_BRANCH:-$(git symbolic-ref --short HEAD)}" +PUBLISH_URL="${PUBLISH_URL:-https://charts.opencord.org}" + +mkdir -p "${REPO_DIR}" + +while IFS= read -r -d '' chart +do + chartdir=$(dirname "${chart}") + + echo "Adding ${chartdir}" + + helm package --dependency-update --destination "${REPO_DIR}" "${chartdir}" + +done < <(find "${WORKSPACE}" -name Chart.yaml -print0) + +echo "Generating repo index" + +helm repo index "${REPO_DIR}" --url "${PUBLISH_URL}" --merge index.yaml + +echo "Finished, chart repo generated: ${REPO_DIR}" + diff --git a/helm-charts/scripts/pki/.gitignore b/helm-charts/scripts/pki/.gitignore new file mode 100644 index 0000000..3c69f2e --- /dev/null +++ b/helm-charts/scripts/pki/.gitignore @@ -0,0 +1,4 @@ +*.pem +*.key +*.csr +root_ca diff --git a/helm-charts/scripts/pki/Makefile b/helm-charts/scripts/pki/Makefile new file mode 100644 index 0000000..2b27fe7 --- /dev/null +++ b/helm-charts/scripts/pki/Makefile @@ -0,0 +1,97 @@ +# Copyright 2017-present Open Networking Foundation +# +# 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. + +# XOS pki makefile +# Configuration is also given in xos-pki.cnf + +SHELL = bash -eu -o pipefail + +# parameters +KEY_SIZE ?= 2048 +EXPIRATION_DAYS ?= 366 +OPENSSL_CNF ?= xos-pki.cnf + +# utility/validation targets + +help: + @echo "Usually you want to run 'make all_certs'" + +validate: + openssl verify -verbose -purpose sslserver -CAfile xos-CA.pem xos-core.crt + +printca: xos-CA.pem + openssl x509 -in $< -text -noout + +printkey: xos-core.key + openssl rsa -in $< -check + +printcsr: xos-core.csr + openssl req -in $< -text -noout -verify + +printpem: xos-core.pem + openssl x509 -in $< -text -noout + +all_certs: xos-core.pem + +clean: + rm -rf root_ca *.pem *.key *.csr + +# CA creation +root_ca: + mkdir -p root_ca/private root_ca/newcerts + chmod 700 root_ca/private + echo 1000 > root_ca/serial + touch root_ca/index.txt + +root_ca/private/ca_root_phrase: root_ca + @echo "TestingXOSRootCAPassPhrase" > root_ca/private/ca_root_phrase + +root_ca/private/ca_key.pem: root_ca root_ca/private/ca_root_phrase + @echo "## Creating CA private key, $@" + openssl genrsa -aes256 \ + -passout file:root_ca/private/ca_root_phrase \ + -out root_ca/private/ca_key.pem $(KEY_SIZE) + +xos-CA.pem: xos-pki.cnf root_ca/private/ca_key.pem + @echo "## Creating self-signed CA public key: $@" + openssl req -config $(OPENSSL_CNF) \ + -new -x509 -days $(EXPIRATION_DAYS) -sha256 \ + -extensions v3_ca \ + -key root_ca/private/ca_key.pem \ + -passin file:root_ca/private/ca_root_phrase \ + -subj "/C=US/ST=California/L=Menlo Park/O=ONF/OU=Testing Only/CN=CORD Test Root CA" \ + -out $@ + +# cert creation +.PRECIOUS: %.key %.csr # don't delete intermediate files + +%.key: + @echo "## Creating server private key: $@" + openssl genrsa -out $@ $(KEY_SIZE) + +%.csr: %.key $(OPENSSL_CNF) + @echo "## Creating signing request $@ from $<" + openssl req -config $(OPENSSL_CNF) \ + -new -sha256 -key $< \ + -subj "/C=US/ST=California/L=Menlo Park/O=ONF/OU=Testing Only/CN=$*" \ + -out $@ + +%.pem: %.csr xos-CA.pem $(OPENSSL_CNF) + @echo "## Signing voltha.csr to create signed public key: voltha.crt" + openssl ca -config $(OPENSSL_CNF) \ + -batch -days $(EXPIRATION_DAYS) -md sha256 \ + -passin file:root_ca/private/ca_root_phrase \ + -extensions $* \ + -in $< \ + -out $@ diff --git a/helm-charts/scripts/pki/README.md b/helm-charts/scripts/pki/README.md new file mode 100644 index 0000000..2aeaea1 --- /dev/null +++ b/helm-charts/scripts/pki/README.md @@ -0,0 +1,12 @@ +# XOS Certificate Generation + +To create certificates for use with XOS, you'll need a system with `make` and +the `openssl` cli tool. + +Most frequently you'll want to run `make all_certs`, then copy the files: + +- `xos-CA.pem` +- `xos-core.pem` +- `xos-core.key` + +into the `xos-core/pki` chart directory. diff --git a/helm-charts/scripts/pki/xos-pki.cnf b/helm-charts/scripts/pki/xos-pki.cnf new file mode 100644 index 0000000..5349054 --- /dev/null +++ b/helm-charts/scripts/pki/xos-pki.cnf @@ -0,0 +1,88 @@ +# Copyright 2017-present Open Networking Foundation +# +# 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. + +[ ca ] +default_ca = CA_default + +[ CA_default ] +dir = ./root_ca +certs = $dir/certs +crl_dir = $dir/crl +new_certs_dir = $dir/newcerts +database = $dir/index.txt +serial = $dir/serial + +private_key = $dir/private/ca_key.pem +certificate = xos-CA.pem + +# Make new requests easier to sign - allow two subjects with same name +# (Or revoke the old certificate first.) +unique_subject = no +preserve = no + +# for CA that signs client certs +policy = policy_loose + +[ policy_loose ] +# Allow the to sign more types of certs +countryName = optional +stateOrProvinceName = optional +localityName = optional +organizationName = optional +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +[ req ] +default_bits = 2048 +default_days = 366 +default_md = sha256 +distinguished_name = req_distinguished_name +string_mask = utf8only +x509_extensions = v3_ca + +[ req_distinguished_name ] +# See . +countryName = Country Name (2 letter code) +stateOrProvinceName = State or Province Name +localityName = Locality Name +0.organizationName = Organization Name +organizationalUnitName = Organizational Unit Name +commonName = Common Name +emailAddress = Email Address + +# Defaults DN +countryName_default = US +stateOrProvinceName_default = California +localityName_default = Menlo Park +0.organizationName_default = ONF +organizationalUnitName_default = Testing Only +commonName = CORD Testing +emailAddress_default = do-not-reply@opencord.org + +[ v3_ca ] +# Extensions for a typical CA (`man x509v3_config`). +subjectKeyIdentifier = hash +authorityKeyIdentifier = keyid:always,issuer +basicConstraints = critical, CA:TRUE +keyUsage = critical, digitalSignature, cRLSign, keyCertSign + +# Extensions for certificates (`man x509v3_config`). +[ xos-core ] +subjectKeyIdentifier = hash +authorityKeyIdentifier = keyid,issuer:always +basicConstraints = CA:FALSE +keyUsage = critical, digitalSignature, keyEncipherment +extendedKeyUsage = serverAuth +subjectAltName = 'DNS:xos-core, DNS:xos-core.default, DNS:xos-core.default.svc.cluster.local' diff --git a/helm-charts/scripts/wait_for_jobs.sh b/helm-charts/scripts/wait_for_jobs.sh new file mode 100755 index 0000000..5b48870 --- /dev/null +++ b/helm-charts/scripts/wait_for_jobs.sh @@ -0,0 +1,86 @@ +#!/usr/bin/env bash + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# wait_for_jobs.sh +# waits for all kubernetes jobs to complete before exiting +# inspired by similar scripts in Kolla-Kubernetes and Openstack Helm + +set -eu -o pipefail +fail_wfj=0 + +# Set these to configure maximum timeout, and interval for checks +JOBS_TIMEOUT=${JOBS_TIMEOUT:-600} +CHECK_INTERVAL=${CHECK_INTERVAL:-5} +KUBECTL_ARGS=${KUBECTL_ARGS:-} + +# calculate timeout time +START_TIME=$(date +%s) +END_TIME=$((START_TIME + JOBS_TIMEOUT)) + +echo "wait_for_jobs.sh - Waiting up to ${JOBS_TIMEOUT} seconds for all Kubernetes jobs to complete" +echo "Number printed is number of currently active jobs" + +prev_job_count=0 + +while true; do + NOW=$(date +%s) + + # handle timeout without completion + if [ "$NOW" -gt "$END_TIME" ] + then + echo "Jobs didn't complete before timeout of ${JOBS_TIMEOUT} seconds" + fail_wfj=1 + break + fi + + # get list of active jobs, and count of them + # jsonpath is picky about string vs comparison quoting, so have to have: + # shellcheck disable=SC2026,SC2086 + active_jobs=$(kubectl get jobs $KUBECTL_ARGS -o=jsonpath='{range .items[?(@.status.active=='1')]}{.metadata.name}{"\n"}{end}') + + # this always is 1 or more, as echo leaves a newline in the output which wc + # counts as a line + active_job_count=$(echo -n "${active_jobs}" | wc -l) + + # if no jobs active, print runtime and break + if [ -z "$active_jobs" ] + then + runtime=$((NOW - START_TIME)) + echo "" + echo "All jobs completed in $runtime seconds" + break + fi + + # deal with changes in number of jobs + if [ "$active_job_count" -ne "$prev_job_count" ] + then + echo "" + echo "Number of active jobs changed - current jobs:" + echo "$active_jobs" + fi + prev_job_count=$active_job_count + + # print number of remaining jobs every $CHECK_INTERVAL + echo -n "$active_job_count " + sleep "$CHECK_INTERVAL" +done + +echo "" +echo "Job Status - Name | Start Time | Completion Time" +# shellcheck disable=SC2086 +kubectl get jobs $KUBECTL_ARGS -o=jsonpath='{range .items[*]}{.metadata.name}{"\t| "}{.status.startTime}{" | "}{.status.completionTime}{"\n"}{end}' + +exit ${fail_wfj} diff --git a/helm-charts/scripts/wait_for_pods.sh b/helm-charts/scripts/wait_for_pods.sh new file mode 100755 index 0000000..6d58010 --- /dev/null +++ b/helm-charts/scripts/wait_for_pods.sh @@ -0,0 +1,116 @@ +#!/usr/bin/env bash + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# wait_for_pods.sh +# waits for all kubernetes pods to complete before exiting, optionally only +# pods in a specific namespace passed as first argument +# inspired by similar scripts in Kolla-Kubernetes and Openstack Helm + +set -e -o pipefail +fail_wfp=0 + +# Set these to configure maximum timeout, and interval for checks +PODS_TIMEOUT=${PODS_TIMEOUT:-600} +CHECK_INTERVAL=${CHECK_INTERVAL:-5} +KUBECTL_ARGS=${KUBECTL_ARGS:-} + +# use namespace if passed as first arg, or "all" for all namespaces +if [ ! -z "$1" ] +then + if [[ "$1" == "all" ]] + then + KUBECTL_ARGS+=" --all-namespaces" + else + KUBECTL_ARGS+=" --namespace=$1" + fi +fi +set -u + +# calculate timeout time +START_TIME=$(date +%s) +END_TIME=$((START_TIME + PODS_TIMEOUT)) + +echo "wait_for_pods.sh - Waiting up to ${PODS_TIMEOUT} seconds for all Kubernetes pods to be ready" +echo "Number printed is number of jobs/pods/containers waiting to be ready" + +prev_total_unready=0 + +while true; do + NOW=$(date +%s) + + # handle timeout without completion + if [ "$NOW" -gt "$END_TIME" ] + then + echo "Pods/Containers/Jobs not ready before timeout of ${PODS_TIMEOUT} seconds" + fail_wfp=1 + break + fi + + # get list of uncompleted items with jsonpath, then count them with wc + # ref: https://kubernetes.io/docs/reference/kubectl/jsonpath/ + # jsonpath is picky about string vs comparison quoting, so may need to + # disable SC2026 for these lines. SC2086 allows for multiple args. + + # shellcheck disable=SC2026,SC2086 + pending_pods=$(kubectl get pods ${KUBECTL_ARGS} -o=jsonpath='{range .items[?(@.status.phase=="Pending")]}{.metadata.name}{"\n"}{end}') + # check for empty string before counting lines, echo adds a newline + if [ -z "$pending_pods" ]; then + pending_pod_count=0 + else + pending_pod_count=$( echo "$pending_pods" | wc -l) + fi + + # shellcheck disable=SC2026,SC2086 + unready_containers=$(kubectl get pods ${KUBECTL_ARGS} -o=jsonpath='{range .items[?(@.status.phase=="Running")]}{range .status.containerStatuses[?(@.ready==false)]}{.name}: {.ready}{"\n"}{end}{end}') + if [ -z "$unready_containers" ]; then + unready_container_count=0 + else + unready_container_count=$(echo "$unready_containers" | wc -l) + fi + + # shellcheck disable=SC2026,SC2086 + active_jobs=$(kubectl get jobs $KUBECTL_ARGS -o=jsonpath='{range .items[?(@.status.active=='1')]}{.metadata.name}{"\n"}{end}') + if [ -z "$active_jobs" ]; then + active_job_count=0 + else + active_job_count=$(echo "$active_jobs" | wc -l) + fi + + total_unready=$((pending_pod_count + unready_container_count + active_job_count)) + + # if everything is ready, print runtime and break + if [ "$total_unready" -eq 0 ] + then + runtime=$((NOW - START_TIME)) + echo "" + echo "All pods ready in $runtime seconds" + break + fi + + # deal with changes in number of jobs + if [ "$total_unready" -ne "$prev_total_unready" ] + then + echo "" + echo "Change in unready pods - Pending Pods: $pending_pod_count, Unready Containers: $unready_container_count, Active Jobs: $active_job_count" + fi + prev_total_unready=$total_unready + + # print number of unready pods every $CHECK_INTERVAL + echo -n "$total_unready " + sleep "$CHECK_INTERVAL" +done + +exit ${fail_wfp} diff --git a/helm-charts/scripts/yamllint.conf b/helm-charts/scripts/yamllint.conf new file mode 100644 index 0000000..a0e02ab --- /dev/null +++ b/helm-charts/scripts/yamllint.conf @@ -0,0 +1,13 @@ +--- +# yamllint.conf + +extends: default + +rules: + empty-lines: + max-end: 1 + line-length: + max: 120 + braces: + min-spaces-inside: 0 + max-spaces-inside: 1 diff --git a/helm-charts/storage/README.md b/helm-charts/storage/README.md new file mode 100644 index 0000000..3f2a426 --- /dev/null +++ b/helm-charts/storage/README.md @@ -0,0 +1,335 @@ +# CORD Storage charts + +These charts implement persistent storage that is within Kubernetes. + +See the Kubernetes documentation for background material on how persistent +storage works: + +- [StorageClass](https://kubernetes.io/docs/concepts/storage/storage-classes/) +- [PersistentVolume](https://kubernetes.io/docs/concepts/storage/persistent-volumes/) + +Using persistent storage is optional during development, but should be +provisioned for and configured during production and realistic testing +scenarios. + +## Local Directory + +The `local-provisioner` chart creates +[local](https://kubernetes.io/docs/concepts/storage/volumes/#local) volumes on +specific nodes, from directories. As there are no enforced limits for volume +size and the node names are preconfigured, this chart is intended for use only +for development and testing. + +Multiple directories can be specified in the `volumes` list - an example is +given in the `values.yaml` file of the chart. + +The `StorageClass` created for all volumes is `local-directory`. + +There is an ansible script that automates the creation of directories on all +the kubernetes nodes. Make sure that the inventory name in ansible matches the +one given as `host` in the `volumes` list, then invoke with: + +```shell +ansible-playbook -i --extra-vars "helm_values_file:" local-directory-playbook.yaml +``` + +## Local Provisioner + +The `local-provisioner` chart provides a +[local](https://kubernetes.io/docs/concepts/storage/volumes/#local), +non-distributed `PersistentVolume` that is usable on one specific node. It +does this by running the k8s [external storage local volume +provisioner](https://github.com/kubernetes-incubator/external-storage/tree/master/local-volume/helm/provisioner). + +This type of storage is useful for workloads that have their own intrinsic HA +or redundancy strategies, and only need storage on multiple nodes. + +This provisioner is not "dynamic" in the sense that that it can't create a new +`PersistentVolume` on demand from a storage pool, but the provisioner can +automatically create volumes as disks/partitions are mounted on the nodes. + +To create a new PV, a disk or partition on a node has to be formatted and +mounted in specific locations, after which the provisioner will automatically +create a `PersistentVolume` for the mount. As these volumes can't be split or +resized, care must be taken to ensure that the correct quantity, types, and +sizes of mounts are created for all the `PersistentVolumeClaim`'s required to +be bound for a specific workload. + +By default, two `StorageClasses` were created to differentiate between Hard +Disks and SSD's: + +- `local-hdd`, which offers PV's on volumes mounted in `/mnt/local-storage/hdd/*` +- `local-ssd`, which offers PV's on volumes mounted in `/mnt/local-storage/ssd/*` + +### Adding a new local volume on a node + +If you wanted to add a new volume a node, you'd physically install a new disk +in the system, then determine the device file it uses. Assuming that it's a +hard disk and the device file is `/dev/sdb`, you might partition, format, and +mount the disk like this: + +```shell +$ sudo parted -s /dev/sdb \ + mklabel gpt \ + mkpart primary ext4 1MiB 100% +$ sudo mkfs.ext4 /dev/sdb1 +$ echo "/dev/sdb1 /mnt/local-storage/hdd/sdb1 ext4 defaults 0 0" | sudo tee -a /etc/fstab +$ sudo mount /mnt/local-storage/hdd/sdb1 +``` + +Then check that the `PersistentVolume` is created by the `local-provisioner`: + +```shell +$ kubectl get pv +NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE +local-pv-2bfa2c43 19Gi RWO Delete Available local-hdd 6h + +$ kubectl describe pv local-pv- +Name: local-pv-2bfa2c43 +Labels: +Annotations: pv.kubernetes.io/provisioned-by=local-volume-provisioner-node1-... +Finalizers: [kubernetes.io/pv-protection] +StorageClass: local-hdd +Status: Available +Claim: +Reclaim Policy: Delete +Access Modes: RWO +Capacity: 19Gi +Node Affinity: + Required Terms: + Term 0: kubernetes.io/hostname in [node1] +Message: +Source: + Type: LocalVolume (a persistent volume backed by local storage on a node) + Path: /mnt/local-storage/hdd/sdb1 +Events: +``` + +## Ceph deployed with Rook + +[Rook](https://rook.github.io/) provides an abstraction layer for Ceph and +other distributed persistent data storage systems. + +There are 3 Rook charts included with CORD: + +- `rook-operator`, which runs the volume provisioning portion of Rook (and is a + thin wrapper around the upstream [rook-ceph + chart](https://rook.github.io/docs/rook/v0.8/helm-operator.html) +- `rook-cluster`, which defines the Ceph cluster and creates these + `StorageClass` objects usable by other charts: + - `cord-ceph-rbd`, dynamically create `PersistentVolumes` when a + `PersistentVolumeClaim` is created. These volumes are only usable by a + single container at a time. + - `cord-cephfs`, a single shared filesystem which is mountable + `ReadWriteMulti` on multiple containers via `PersistentVolumeClaim`. It's + size is predetermined. +- `rook-tools`, which provides a toolbox container for troubleshooting problems + with Rook/Ceph + +To create persistent volumes, you will need to load the first 2 charts, with +the third only needed for troubleshooting and diagnostics. + +### Rook Node Prerequisties + +By default, all the nodes running k8s are expected to have a directory named +`/mnt/ceph` where the Ceph data is stored (the `cephDataDir` variable can be +used to change this path). + +In a production deployment, this would ideally be located on it's own block +storage device. + +There should be at least 3 nodes with storage available to provide data +redundancy. + +### Loading Rook Charts + +First, add the `rook-beta` repo to helm, then load the `rook-operator` chart +into the `rook-ceph-system` namespace: + +```shell +cd helm-charts/storage +helm repo add rook-beta https://charts.rook.io/beta +helm dep update rook-operator +helm install --namespace rook-ceph-system -n rook-operator rook-operator +``` + +Check that it's running (it will start the `rook-ceph-agent` and +`rook-discover` DaemonSets): + +```shell +$ kubectl -n rook-ceph-system get pods +NAME READY STATUS RESTARTS AGE +rook-ceph-agent-4c66b 1/1 Running 0 6m +rook-ceph-agent-dsdsr 1/1 Running 0 6m +rook-ceph-agent-gwjlk 1/1 Running 0 6m +rook-ceph-operator-687b7bb6ff-vzjsl 1/1 Running 0 7m +rook-discover-9f87r 1/1 Running 0 6m +rook-discover-lmhz9 1/1 Running 0 6m +rook-discover-mxsr5 1/1 Running 0 6m +``` + +Next, load the `rook-cluster` chart, which connects the storage on the nodes to +the Ceph pool, and the CephFS filesystem: + +```shell +helm install -n rook-cluster rook-cluster +``` + +Check that the cluster is running - this may take a few minutes, and look for the +`rook-ceph-mds-*` containers to start: + +```shell +$ kubectl -n rook-ceph get pods +NAME READY STATUS RESTARTS AGE +rook-ceph-mds-cord-ceph-filesystem-7564b648cf-4wxzn 1/1 Running 0 1m +rook-ceph-mds-cord-ceph-filesystem-7564b648cf-rcvnx 1/1 Running 0 1m +rook-ceph-mgr-a-75654fb698-zqj67 1/1 Running 0 5m +rook-ceph-mon0-v9d2t 1/1 Running 0 5m +rook-ceph-mon1-4sxgc 1/1 Running 0 5m +rook-ceph-mon2-6b6pj 1/1 Running 0 5m +rook-ceph-osd-id-0-85d887f76c-44w9d 1/1 Running 0 4m +rook-ceph-osd-id-1-866fb5c684-lmxfp 1/1 Running 0 4m +rook-ceph-osd-id-2-557dd69c5c-qdnmb 1/1 Running 0 4m +rook-ceph-osd-prepare-node1-bfzzm 0/1 Completed 0 4m +rook-ceph-osd-prepare-node2-dt4gx 0/1 Completed 0 4m +rook-ceph-osd-prepare-node3-t5fnn 0/1 Completed 0 4m + +$ kubectl -n rook-ceph get storageclass +NAME PROVISIONER AGE +cord-ceph-rbd ceph.rook.io/block 6m +cord-cephfs kubernetes.io/no-provisioner 6m + +$ kubectl -n rook-ceph get filesystems +NAME AGE +cord-ceph-filesystem 6m + +$ kubectl -n rook-ceph get pools +NAME AGE +cord-ceph-pool 6m + +$ kubectl -n rook-ceph get persistentvolume +NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE +cord-cephfs-pv 20Gi RWX Retain Available cord-cephfs 7m +``` + +At this point you can create a `PersistentVolumeClaim` on `cord-ceph-rbd` and a +corresponding `PersistentVolume` will be created by the `rook-ceph-operator` +acting as a volume provisioner and bound to the PVC. + +Creating a `PeristentVolumeClaim` on `cord-cephfs` will mount the same CephFS +filesystem on every container that requests it. The CephFS PV implementation +currently isn't as mature as the Ceph RDB volumes, and may not remount properly +when used with a PVC. + +### Troubleshooting Rook + +Checking the `rook-ceph-operator` logs can be enlightening: + +```shell +kubectl -n rook-ceph-system logs -f rook-ceph-operator-... +``` + +The [Rook toolbox container](https://rook.io/docs/rook/v0.8/toolbox.html) has +been containerized as the `rook-tools` chart, and provides a variety of tools +for debugging Rook and Ceph. + +Load the `rook-tools` chart: + +```shell +helm install -n rook-tools rook-tools +``` + +Once the container is running (check with `kubectl -n rook-ceph get pods`), +exec into it to run a shell to access all tools: + +```shell +kubectl -n rook-ceph exec -it rook-ceph-tools bash +``` + +or run a one-off command: + +```shell +kubectl -n rook-ceph exec rook-ceph-tools -- ceph status +``` + +or mount the CephFS volume: + +```shell +kubectl -n rook-ceph exec -it rook-ceph-tools bash +mkdir /mnt/cephfs +mon_endpoints=$(grep mon_host /etc/ceph/ceph.conf | awk '{print $3}') +my_secret=$(grep key /etc/ceph/keyring | awk '{print $3}') +mount -t ceph -o name=admin,secret=$my_secret $mon_endpoints:/ /mnt/cephfs +ls /mnt/cephfs +``` + +### Cleaning up after Rook + +The `rook-operator` chart will leave a few `DaemonSet` behind after it's +removed. Clean these up using these commands: + +```shell +kubectl -n rook-ceph-system delete daemonset rook-ceph-agent +kubectl -n rook-ceph-system delete daemonset rook-discover +helm delete --purge rook-operator +``` + +If you have other charts that create `PersistentVolumeClaims`, you may need to +clean them up manually (for example, if you've changed the `StorageClass` they +use), list them with: + +```shell +kubectl --all-namespaces get pvc +``` + +Files may be left behind in the Ceph storage directory and/or Rook +configuration that need to be deleted before starting `rook-*` charts. If +you've used the `automation-tools/kubespray-installer` scripts to set up a +environment named `test`, you can delete all these files with the following +commands: + +```shell +cd cord/automation-tools/kubespray-installer +ansible -i inventories/test/inventory.cfg -b -m shell -a "rm -rf /var/lib/rook && rm -rf /mnt/ceph/*" all +``` + +The current upgrade process for Rook involves manual intervention and +inspection using the tools container. + +## Using Persistent Storage + +The general process for using persistent storage is to create a +[PersistentVolumeClaim](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims) +on the appropriate +[StorageClass](https://kubernetes.io/docs/concepts/storage/storage-classes/) +for the workload you're trying to run. + +### Example: XOS Database on a local directory + +For development and testing, it may be useful to persist the XOS database + +```shell +helm install -f examples/xos-db-local-dir.yaml -n xos-core xos-core +``` + +### Example: XOS Database on a Ceph RBD volume + +The XOS Database (Postgres) wants a volume that persists if a node goes down or +is taken out of service, not shared with other containers running Postgres, +thus the Ceph RBD volume is a reasonable choice to use with it. + +```shell +helm install -f examples/xos-db-ceph-rbd.yaml -n xos-core xos-core +``` + +### Example: Docker Registry on CephFS shared filesystem + +The Docker Registry wants a filesystem that is the shared across all +containers, so it's a suitable workload for the `cephfs` shared filesystem. + +There's an example values file available in `helm-charts/examples/registry-cephfs.yaml` + +```shell +helm install -f examples/registry-cephfs.yaml -n docker-registry stable/docker-registry +``` + diff --git a/helm-charts/storage/local-directory/Chart.yaml b/helm-charts/storage/local-directory/Chart.yaml new file mode 100644 index 0000000..d343bf9 --- /dev/null +++ b/helm-charts/storage/local-directory/Chart.yaml @@ -0,0 +1,17 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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: local-directory +version: 0.1.0-dev0 diff --git a/helm-charts/storage/local-directory/local-directory-playbook.yaml b/helm-charts/storage/local-directory/local-directory-playbook.yaml new file mode 100644 index 0000000..0c03add --- /dev/null +++ b/helm-charts/storage/local-directory/local-directory-playbook.yaml @@ -0,0 +1,41 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# This playbook will create directories needed by the local-directories helm +# chart that will be turned into k8s PersistentVolumes +# +# For dev use only - use real volumes/disks in production + +- hosts: all + become: yes + + vars: + helm_values_file: ./values.yaml + + tasks: + - name: Read yaml from helm_values_file + set_fact: + helm_values: "{{ lookup('file', helm_values_file) | from_yaml }}" + + - name: Create directories on nodes + when: item.host == ansible_hostname + file: + path: "{{ item.directory }}" + state: directory + owner: root + group: root + mode: 0755 + with_items: "{{ helm_values.volumes }}" + diff --git a/helm-charts/storage/local-directory/templates/NOTES.txt b/helm-charts/storage/local-directory/templates/NOTES.txt new file mode 100644 index 0000000..7cf053a --- /dev/null +++ b/helm-charts/storage/local-directory/templates/NOTES.txt @@ -0,0 +1,9 @@ +A StorageClass was created: {{ .Values.storageClassName }} + +The following PersistentVolumes were created using directories on these nodes: + +# PV Name, Host, Size, Host Directory +{{- range $volume := .Values.volumes }} +{{ $volume.name }}, {{ $volume.host}}, {{ $volume.size }}, {{ $volume.directory }} +{{- end }} + diff --git a/helm-charts/storage/local-directory/templates/localdirs.yaml b/helm-charts/storage/local-directory/templates/localdirs.yaml new file mode 100644 index 0000000..04a9f51 --- /dev/null +++ b/helm-charts/storage/local-directory/templates/localdirs.yaml @@ -0,0 +1,46 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +kind: StorageClass +apiVersion: storage.k8s.io/v1 +metadata: + name: {{ .Values.storageClassName }} +provisioner: kubernetes.io/no-provisioner +volumeBindingMode: WaitForFirstConsumer + +{{- range $volume := .Values.volumes }} +--- +apiVersion: v1 +kind: PersistentVolume +metadata: + name: {{ $volume.name }} +spec: + capacity: + storage: {{ $volume.size }} + accessModes: + - ReadWriteOnce + persistentVolumeReclaimPolicy: Retain + storageClassName: {{ $.Values.storageClassName }} + local: + path: {{ $volume.directory }} + nodeAffinity: + required: + nodeSelectorTerms: + - matchExpressions: + - key: kubernetes.io/hostname + operator: In + values: + - {{ $volume.host }} +{{- end }} diff --git a/helm-charts/storage/local-directory/values.yaml b/helm-charts/storage/local-directory/values.yaml new file mode 100644 index 0000000..fbafd9b --- /dev/null +++ b/helm-charts/storage/local-directory/values.yaml @@ -0,0 +1,27 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +storageClassName: local-directory + +volumes: + - name: "small-pv" + size: "2Gi" + host: "node1" + directory: "/var/kubernetes_local_directories/small-pv" + - name: "large-pv" + size: "10Gi" + host: "node1" + directory: "/var/kubernetes_local_directories/large-pv" + diff --git a/helm-charts/storage/local-provisioner/Chart.yaml b/helm-charts/storage/local-provisioner/Chart.yaml new file mode 100644 index 0000000..d99ade5 --- /dev/null +++ b/helm-charts/storage/local-provisioner/Chart.yaml @@ -0,0 +1,29 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# NOTE: this Apache v2 licensed code originally came from: +# https://github.com/kubernetes-incubator/external-storage/tree/master/local-volume/helm/provisioner +# at commit: fc25fd337b15a413b1162f76b59b2cac7ff39126 +# +# Minimal changes have been applied to align it with CORD/SEBA + +apiVersion: v1 +version: 2.0.0 +description: local provisioner chart +name: local-provisioner +keywords: + - storage + - local +engine: gotpl diff --git a/helm-charts/storage/local-provisioner/provisioner-namespace.yaml b/helm-charts/storage/local-provisioner/provisioner-namespace.yaml new file mode 100644 index 0000000..5923b16 --- /dev/null +++ b/helm-charts/storage/local-provisioner/provisioner-namespace.yaml @@ -0,0 +1,21 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +{{- if .Values.common.rbac }} +apiVersion: v1 +kind: Namespace +metadata: + name: {{ .Values.common.namespace }} +{{- end }} diff --git a/helm-charts/storage/local-provisioner/templates/00_provisioner_rbac.yaml b/helm-charts/storage/local-provisioner/templates/00_provisioner_rbac.yaml new file mode 100644 index 0000000..7ddedd9 --- /dev/null +++ b/helm-charts/storage/local-provisioner/templates/00_provisioner_rbac.yaml @@ -0,0 +1,101 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +{{- if .Values.common.rbac }} +apiVersion: v1 +kind: Namespace +metadata: + name: {{ .Values.common.namespace }} + +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ .Values.daemonset.serviceAccount }} + namespace: {{ .Values.common.namespace }} + +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: local-storage-provisioner-pv-binding + namespace: {{ .Values.common.namespace }} +subjects: +- kind: ServiceAccount + name: {{ .Values.daemonset.serviceAccount }} + namespace: {{ .Values.common.namespace }} +roleRef: + kind: ClusterRole + name: system:persistent-volume-provisioner + apiGroup: rbac.authorization.k8s.io + +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: local-storage-provisioner-node-clusterrole + namespace: {{ .Values.common.namespace }} +rules: +- apiGroups: [""] + resources: ["nodes"] + verbs: ["get"] + +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: local-storage-provisioner-node-binding + namespace: {{ .Values.common.namespace }} +subjects: +- kind: ServiceAccount + name: {{ .Values.daemonset.serviceAccount }} + namespace: {{ .Values.common.namespace }} +roleRef: + kind: ClusterRole + name: local-storage-provisioner-node-clusterrole + apiGroup: rbac.authorization.k8s.io + +{{- if .Values.common.useJobForCleaning }} +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: local-storage-provisioner-jobs-role + namespace: {{ .Values.common.namespace }} +rules: +- apiGroups: + - 'batch' + resources: + - jobs + verbs: + - '*' + +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: local-storage-provisioner-jobs-rolebinding + namespace: {{ .Values.common.namespace }} +subjects: +- kind: ServiceAccount + name: {{ .Values.daemonset.serviceAccount }} + namespace: {{ .Values.common.namespace }} +roleRef: + kind: Role + name: local-storage-provisioner + apiGroup: rbac.authorization.k8s.io + +{{- end }} # if .Values.common.useJobForCleaning +{{- end }} # if .Values.common.rbac diff --git a/helm-charts/storage/local-provisioner/templates/provisioner.yaml b/helm-charts/storage/local-provisioner/templates/provisioner.yaml new file mode 100644 index 0000000..1e15e3d --- /dev/null +++ b/helm-charts/storage/local-provisioner/templates/provisioner.yaml @@ -0,0 +1,133 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ .Values.common.configMapName }} + namespace: {{ .Values.common.namespace }} +data: +{{- if .Values.daemonset.nodeLabels }} + nodeLabelsForPV: | + {{- range $label := .Values.daemonset.nodeLabels }} + - {{$label}} + {{- end }} +{{- end }} +{{- if .Values.common.useAlphaAPI }} + useAlphaAPI: "true" +{{- end }} +{{- if .Values.common.useJobForCleaning }} + useJobForCleaning: "yes" +{{- end}} +{{- if .Values.common.minResyncPeriod }} + minResyncPeriod: {{ .Values.common.minResyncPeriod | quote }} +{{- end}} + storageClassMap: | + {{- range $classConfig := .Values.classes }} + {{ $classConfig.name }}: + hostDir: {{ $classConfig.hostDir }} + mountDir: {{ if $classConfig.mountDir }} {{- $classConfig.mountDir -}} {{ else }} {{- $classConfig.hostDir -}} {{ end }} + {{- if $classConfig.blockCleanerCommand }} + blockCleanerCommand: + {{- range $val := $classConfig.blockCleanerCommand }} + - "{{ $val -}}"{{- end}} + {{- end }} + {{- end }} +--- +apiVersion: extensions/v1beta1 +kind: DaemonSet +metadata: + name: {{ .Values.daemonset.name }} + namespace: {{ .Values.common.namespace }} + labels: + app: local-volume-provisioner +spec: + selector: + matchLabels: + app: local-volume-provisioner + template: + metadata: + labels: + app: local-volume-provisioner + spec: + serviceAccountName: {{.Values.daemonset.serviceAccount}} +{{- if .Values.daemonset.tolerations }} + tolerations: +{{ .Values.daemonset.tolerations | toYaml | trim | indent 8 }} +{{- end }} + containers: + - image: "{{ .Values.daemonset.image }}" + {{- if .Values.daemonset.imagePullPolicy }} + imagePullPolicy: {{ .Values.daemonset.imagePullPolicy | quote }} + {{- end }} + name: provisioner + securityContext: + privileged: true +{{- if .Values.daemonset.resources }} + resources: +{{ .Values.daemonset.resources | toYaml | trim | indent 12 }} +{{- end }} + env: + - name: MY_NODE_NAME + valueFrom: + fieldRef: + fieldPath: spec.nodeName + - name: MY_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: JOB_CONTAINER_IMAGE + value: "{{ .Values.daemonset.image }}" + {{- if .Values.daemonset.kubeConfigEnv }} + - name: KUBECONFIG + value: {{.Values.daemonset.kubeConfigEnv}} + {{- end }} + volumeMounts: + - mountPath: /etc/provisioner/config + name: provisioner-config + readOnly: true + - mountPath: /dev + name: provisioner-dev + {{- range $classConfig := .Values.classes }} + - mountPath: {{ if $classConfig.mountDir }} {{- $classConfig.mountDir -}} {{ else }} {{- $classConfig.hostDir -}} {{ end }} + name: {{ $classConfig.name }} + mountPropagation: "HostToContainer" + {{- end }} + volumes: + - name: provisioner-config + configMap: + name: {{ .Values.common.configMapName }} + - name: provisioner-dev + hostPath: + path: /dev + {{- range $classConfig := .Values.classes }} + - name: {{ $classConfig.name }} + hostPath: + path: {{ $classConfig.hostDir }} + {{- end }} + +{{- range $val := .Values.classes }} +{{- if $val.storageClass }} +{{- $reclaimPolicy := $val.reclaimPolicy | default "Delete" }} +--- +apiVersion: storage.k8s.io/v1 +kind: StorageClass +metadata: + name: {{ $val.name }} +provisioner: kubernetes.io/no-provisioner +volumeBindingMode: WaitForFirstConsumer +reclaimPolicy: {{ $reclaimPolicy }} +{{- end }} +{{- end }} diff --git a/helm-charts/storage/local-provisioner/values.yaml b/helm-charts/storage/local-provisioner/values.yaml new file mode 100644 index 0000000..a7e2883 --- /dev/null +++ b/helm-charts/storage/local-provisioner/values.yaml @@ -0,0 +1,133 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Common options. +common: + # Defines whether to generate service account and role bindings. + rbac: true + + # Defines the namespace where provisioner runs + namespace: "local-storage" + + # Beta PV.NodeAffinity field is used by default. If running against pre-1.10 + # k8s version, the `useAlphaAPI` flag must be enabled in the configMap. + useAlphaAPI: false + + # Provisioner clean volumes in process by default. If set to true, provisioner + # will use Jobs to clean. + useJobForCleaning: false + + # Resync period in reflectors will be random between minResyncPeriod and + # 2*minResyncPeriod. Default: 5m0s. + minResyncPeriod: "5m0s" + + # Defines the name of configmap used by Provisioner + configMapName: "local-provisioner-config" + +# Configure storage classes. +classes: + - name: "local-hdd" # hard disk volumes + + # Path on the host where local volumes of this storage class are mounted + # under. + hostDir: "/mnt/local-storage/hdd" + + # Optionally specify mount path of local volumes. By default, we use same + # path as hostDir in container. + mountDir: false + + blockCleanerCommand: + # Do a quick reset of the block device during its cleanup. + - "/scripts/quick_reset.sh" + # or use dd to zero out block dev in two iterations by uncommenting these lines + # - "/scripts/dd_zero.sh" + # - "2" + # or run shred utility for 2 iterations + # - "/scripts/shred.sh" + # - "2" + # or blkdiscard utility by uncommenting the line below. + # - "/scripts/blkdiscard.sh" + + # Uncomment to create storage class object with default configuration. + storageClass: true + + # Avaiable reclaim policies: Delete/Retain, defaults: Delete. + reclaimPolicy: "Delete" + + - name: "local-ssd" # solid state disk volumes + + # Path on the host where local volumes of this storage class are mounted + # under. + hostDir: "/mnt/local-storage/ssd" + + # Optionally specify mount path of local volumes. By default, we use same + # path as hostDir in container. + mountDir: false + + blockCleanerCommand: + # Do a quick reset of the block device during its cleanup. + - "/scripts/quick_reset.sh" + # or use dd to zero out block dev in two iterations by uncommenting these lines + # - "/scripts/dd_zero.sh" + # - "2" + # or run shred utility for 2 iterations + # - "/scripts/shred.sh" + # - "2" + # or blkdiscard utility by uncommenting the line below. + # - "/scripts/blkdiscard.sh" + + # Uncomment to create storage class object with default configuration. + storageClass: true + + # Avaiable reclaim policies: Delete/Retain, defaults: Delete. + reclaimPolicy: "Delete" + + +# Configure DaemonSet for provisioner. +daemonset: + + # Defines the name of a Provisioner + name: "local-volume-provisioner" + + # Defines Provisioner's image name including container registry. + image: "quay.io/external_storage/local-volume-provisioner:v2.1.0" + + # Defines Image download policy, see kubernetes documentation for available values. + imagePullPolicy: 'IfNotPresent' + + # Defines a name of the service account which Provisioner will use to communicate with API server. + serviceAccount: "local-storage-admin" + + # If configured KubeConfigEnv will (optionally) specify the location of kubeconfig file on the node. + # kubeConfigEnv: KUBECONFIG + kubeConfigEnv: false + + # List of node labels to be copied to the PVs created by the provisioner in a format: + # + # nodeLabels: + # - failure-domain.beta.kubernetes.io/zone + # - failure-domain.beta.kubernetes.io/region + nodeLabels: [] + + # If configured, tolerations will add a toleration field to the DaemonSet PodSpec. + # + # Node tolerations for local-volume-provisioner scheduling to nodes with taints. + # Ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + tolerations: [] + + # If configured, resources will set the requests/limits field to the Daemonset PodSpec. + # Ref: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/ + resources: {} + diff --git a/helm-charts/storage/rook-cluster/Chart.yaml b/helm-charts/storage/rook-cluster/Chart.yaml new file mode 100644 index 0000000..0c80d0f --- /dev/null +++ b/helm-charts/storage/rook-cluster/Chart.yaml @@ -0,0 +1,18 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +description: Sets up Rook for Ceph storage in testing environments +name: rook-cluster +version: 0.1.0-dev0 diff --git a/helm-charts/storage/rook-cluster/templates/00_rook_rbac.yaml b/helm-charts/storage/rook-cluster/templates/00_rook_rbac.yaml new file mode 100644 index 0000000..9bb4fa6 --- /dev/null +++ b/helm-charts/storage/rook-cluster/templates/00_rook_rbac.yaml @@ -0,0 +1,74 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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 more information, see documentation: +# https://rook.io/docs/rook/v0.8/rbac.html +# https://github.com/rook/rook/blob/master/cluster/examples/kubernetes/ceph/cluster.yaml + +apiVersion: v1 +kind: Namespace +metadata: + name: {{ .Values.rookClusterNamespace }} + +--- +# Next 3 items: Allow the pods in this namespace to work with configmaps +apiVersion: v1 +kind: ServiceAccount +metadata: + name: rook-ceph-cluster + namespace: {{ .Values.rookClusterNamespace }} + +--- +kind: Role +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: rook-ceph-cluster + namespace: {{ .Values.rookClusterNamespace }} +rules: +- apiGroups: [""] + resources: ["configmaps"] + verbs: [ "get", "list", "watch", "create", "update", "delete" ] + +--- +kind: RoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: rook-ceph-cluster + namespace: {{ .Values.rookClusterNamespace }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: rook-ceph-cluster +subjects: +- kind: ServiceAccount + name: rook-ceph-cluster + namespace: {{ .Values.rookClusterNamespace }} + +--- +# Allow the operator to create resources in this cluster's namespace +kind: RoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: rook-ceph-cluster-mgmt + namespace: {{ .Values.rookClusterNamespace }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: rook-ceph-cluster-mgmt +subjects: +- kind: ServiceAccount + name: rook-ceph-system + namespace: {{ .Values.rookSystemNamespace }} + diff --git a/helm-charts/storage/rook-cluster/templates/NOTES.txt b/helm-charts/storage/rook-cluster/templates/NOTES.txt new file mode 100644 index 0000000..ede3f63 --- /dev/null +++ b/helm-charts/storage/rook-cluster/templates/NOTES.txt @@ -0,0 +1,11 @@ +This chart creates a Ceph cluster using Rook (similar to Rook's cluster.yaml) + +Ceph data is stored in this directory on all nodes: {{ .Values.cephDataDir }} + +The Ceph pool name is: {{ .Values.rookPoolName }} + +StorageClasses provided: + + Rados Block Device (volumes): {{ .Values.rbdStorageClassName }} + Shared CephFS Filesystem: {{ .Values.fsStorageClassName }}, of size: {{ .Values.rookCephfsPersistentVolumeSize }} + diff --git a/helm-charts/storage/rook-cluster/templates/ceph_cluster.yaml b/helm-charts/storage/rook-cluster/templates/ceph_cluster.yaml new file mode 100644 index 0000000..99d939a --- /dev/null +++ b/helm-charts/storage/rook-cluster/templates/ceph_cluster.yaml @@ -0,0 +1,60 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# reference: https://rook.github.io/docs/rook/v0.8/ceph-cluster-crd.html +# Modeled after "Storage Configuration: Cluster wide Directories" + +apiVersion: ceph.rook.io/v1beta1 +kind: Cluster +metadata: + name: rook-ceph + namespace: {{ .Values.rookClusterNamespace }} +spec: + dataDirHostPath: /var/lib/rook + serviceAccount: rook-ceph-cluster + # cluster level storage configuration and selection + storage: + useAllNodes: true + useAllDevices: false + config: + databaseSizeMB: "1024" # this value can be removed for environments with normal sized disks (100 GB or larger) + journalSizeMB: "1024" # this value can be removed for environments with normal sized disks (20 GB or larger) + directories: + - path: {{ .Values.cephDataDir | quote }} + +--- +# reference: https://rook.io/docs/rook/v0.8/ceph-pool-crd.html + +apiVersion: ceph.rook.io/v1beta1 +kind: Pool +metadata: + name: {{ .Values.rookPoolName }} + namespace: {{ .Values.rookClusterNamespace }} +spec: + replicated: + size: 2 + +--- +# reference: https://rook.io/docs/rook/v0.8/block.html + +apiVersion: storage.k8s.io/v1 +kind: StorageClass +metadata: + name: {{ .Values.rbdStorageClassName }} +provisioner: ceph.rook.io/block +parameters: + pool: {{ .Values.rookPoolName }} + clusterNamespace: {{ .Values.rookClusterNamespace }} + diff --git a/helm-charts/storage/rook-cluster/templates/ceph_fs.yaml b/helm-charts/storage/rook-cluster/templates/ceph_fs.yaml new file mode 100644 index 0000000..e53d1d3 --- /dev/null +++ b/helm-charts/storage/rook-cluster/templates/ceph_fs.yaml @@ -0,0 +1,58 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# reference: https://rook.github.io/docs/rook/v0.8/filesystem.html + +apiVersion: ceph.rook.io/v1beta1 +kind: Filesystem +metadata: + name: {{ .Values.rookCephfsName }} + namespace: {{ .Values.rookClusterNamespace }} +spec: + metadataPool: + replicated: + size: 2 + dataPools: + - replicated: + size: 2 + metadataServer: + activeCount: 1 + activeStandby: true + +--- +apiVersion: storage.k8s.io/v1 +kind: StorageClass +metadata: + name: {{ .Values.fsStorageClassName }} +provisioner: kubernetes.io/no-provisioner + +--- +apiVersion: v1 +kind: PersistentVolume +metadata: + name: {{ .Values.rookCephfsPersistentVolumeName }} +spec: + storageClassName: {{ .Values.fsStorageClassName }} + capacity: + storage: {{ .Values.rookCephfsPersistentVolumeSize }} + accessModes: + - ReadWriteMany + flexVolume: + driver: ceph.rook.io/rook + fsType: ceph + options: + fsName: {{ .Values.rookCephfsName }} + clusterNamespace: {{ .Values.rookClusterNamespace }} + diff --git a/helm-charts/storage/rook-cluster/values.yaml b/helm-charts/storage/rook-cluster/values.yaml new file mode 100644 index 0000000..04470a9 --- /dev/null +++ b/helm-charts/storage/rook-cluster/values.yaml @@ -0,0 +1,33 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# values file for rook-cluster + +# directory on k8s nodes that holds ceph data +cephDataDir: "/mnt/ceph" + +rookSystemNamespace: "rook-ceph-system" +rookClusterNamespace: "rook-ceph" + +rookPoolName: "cord-ceph-pool" +rookCephfsName: "cord-ceph-filesystem" + +rookCephfsPersistentVolumeName: "cord-cephfs-pv" +rookCephfsPersistentVolumeSize: 20Gi + +# StorageClass used by other charts to create PersistentVolumeClaims +rbdStorageClassName: "cord-ceph-rbd" +fsStorageClassName: "cord-cephfs" + diff --git a/helm-charts/storage/rook-operator/Chart.yaml b/helm-charts/storage/rook-operator/Chart.yaml new file mode 100644 index 0000000..3f48df7 --- /dev/null +++ b/helm-charts/storage/rook-operator/Chart.yaml @@ -0,0 +1,19 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +description: Sets up the Rook operator to provide storage +name: rook-operator +version: 0.1.0-dev0 + diff --git a/helm-charts/storage/rook-operator/requirements.yaml b/helm-charts/storage/rook-operator/requirements.yaml new file mode 100644 index 0000000..a16d9c4 --- /dev/null +++ b/helm-charts/storage/rook-operator/requirements.yaml @@ -0,0 +1,19 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +dependencies: +- name: rook-ceph + version: 0.8.1 + repository: https://charts.rook.io/beta diff --git a/helm-charts/storage/rook-operator/templates/NOTES.txt b/helm-charts/storage/rook-operator/templates/NOTES.txt new file mode 100644 index 0000000..dba486d --- /dev/null +++ b/helm-charts/storage/rook-operator/templates/NOTES.txt @@ -0,0 +1,4 @@ +This chart creates a Ceph provisioning operator with Rook (similar to Rook's operator.yaml) + +It must be run in the {{ .Values.rookSystemNamespace }} namespace + diff --git a/helm-charts/storage/rook-operator/values.yaml b/helm-charts/storage/rook-operator/values.yaml new file mode 100644 index 0000000..55dc678 --- /dev/null +++ b/helm-charts/storage/rook-operator/values.yaml @@ -0,0 +1,23 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# values file for rook-operator + +rookSystemNamespace: "rook-ceph-system" + +rook-ceph: + agent: + flexVolumeDirPath: "/var/lib/kubelet/volume-plugins" + diff --git a/helm-charts/storage/rook-tools/Chart.yaml b/helm-charts/storage/rook-tools/Chart.yaml new file mode 100644 index 0000000..7d34ce3 --- /dev/null +++ b/helm-charts/storage/rook-tools/Chart.yaml @@ -0,0 +1,20 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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: rook-tools +description: Toolbox for debuging Rook's Ceph storage +version: 0.1.0-dev0 + +appVersion: 'v0.8.1' diff --git a/helm-charts/storage/rook-tools/templates/NOTES.txt b/helm-charts/storage/rook-tools/templates/NOTES.txt new file mode 100644 index 0000000..b08e84c --- /dev/null +++ b/helm-charts/storage/rook-tools/templates/NOTES.txt @@ -0,0 +1,11 @@ +This chart loads the Rook toolbox container. + +Documentation: + https://rook.io/docs/rook/v0.8/toolbox.html + +Once loaded, run: + +kubectl -n {{ .Values.rookClusterNamespace }} exec -it rook-ceph-tools bash + +to access the tools + diff --git a/helm-charts/storage/rook-tools/templates/toolbox.yaml b/helm-charts/storage/rook-tools/templates/toolbox.yaml new file mode 100644 index 0000000..0b14243 --- /dev/null +++ b/helm-charts/storage/rook-tools/templates/toolbox.yaml @@ -0,0 +1,61 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Pod +metadata: + name: rook-ceph-tools + namespace: {{ .Values.rookClusterNamespace }} +spec: + dnsPolicy: ClusterFirstWithHostNet + containers: + - name: rook-ceph-tools + image: {{ .Values.global.registry }}{{ .Values.image.repository }}:{{ tpl .Values.image.tag . }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + env: + - name: ROOK_ADMIN_SECRET + valueFrom: + secretKeyRef: + name: rook-ceph-mon + key: admin-secret + securityContext: + privileged: true + volumeMounts: + - mountPath: /dev + name: dev + - mountPath: /sys/bus + name: sysbus + - mountPath: /lib/modules + name: libmodules + - name: mon-endpoint-volume + mountPath: /etc/rook + hostNetwork: false + volumes: + - name: dev + hostPath: + path: /dev + - name: sysbus + hostPath: + path: /sys/bus + - name: libmodules + hostPath: + path: /lib/modules + - name: mon-endpoint-volume + configMap: + name: rook-ceph-mon-endpoints + items: + - key: data + path: mon-endpoints + diff --git a/helm-charts/storage/rook-tools/values.yaml b/helm-charts/storage/rook-tools/values.yaml new file mode 100644 index 0000000..5fafd08 --- /dev/null +++ b/helm-charts/storage/rook-tools/values.yaml @@ -0,0 +1,27 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# values file for rook-tools + +rookClusterNamespace: 'rook-ceph' + +image: + repository: 'rook/ceph-toolbox' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'IfNotPresent' + +global: + registry: '' + diff --git a/helm-charts/ves-agent/Chart.yaml b/helm-charts/ves-agent/Chart.yaml new file mode 100644 index 0000000..5f97dd0 --- /dev/null +++ b/helm-charts/ves-agent/Chart.yaml @@ -0,0 +1,21 @@ +--- +# Copyright 2018- Cisco +# +# 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: ves-agent +description: A Helm chart for Kubernetes +icon: https://guide.opencord.org/logos/cord.svg + +version: 1.0.0 +appVersion: 1.0.0 diff --git a/helm-charts/ves-agent/templates/_helpers.tpl b/helm-charts/ves-agent/templates/_helpers.tpl new file mode 100644 index 0000000..cd538cd --- /dev/null +++ b/helm-charts/ves-agent/templates/_helpers.tpl @@ -0,0 +1,42 @@ +# Copyright 2018- Cisco +# +# 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. + +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "ves-agent.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "ves-agent.fullname" -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "ves-agent.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} diff --git a/helm-charts/ves-agent/templates/configMap.yaml b/helm-charts/ves-agent/templates/configMap.yaml new file mode 100644 index 0000000..aabb015 --- /dev/null +++ b/helm-charts/ves-agent/templates/configMap.yaml @@ -0,0 +1,36 @@ +# Copyright 2018- Cisco +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: ves-agent-config + labels: + app: {{ template "ves-agent.name" . }} + chart: {{ template "ves-agent.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} + +data: + config.properties: |- + onap_ves_address={{ .Values.onap.ves_address }} + onap_ves_port={{ .Values.onap.ves_port }} + + kafka_address={{ .Values.kafka.address }} + kafka_port={{ .Values.kafka.port }} + kafka_alarms_topic={{ .Values.kafka.alarms_topic }} + kafka_kpis_topic={{ .Values.kafka.kpis_topic }} + + co_id={{ .Values.co_id }} + pod_id={{ .Values.pod_id }} diff --git a/helm-charts/ves-agent/templates/deployment.yaml b/helm-charts/ves-agent/templates/deployment.yaml new file mode 100644 index 0000000..ff9d4a9 --- /dev/null +++ b/helm-charts/ves-agent/templates/deployment.yaml @@ -0,0 +1,52 @@ +# Copyright 2018- Cisco +# +# 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. + +apiVersion: apps/v1beta2 +kind: Deployment +metadata: + name: {{ template "ves-agent.name" . }} + labels: + app: {{ template "ves-agent.name" . }} + chart: {{ template "ves-agent.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + app: {{ template "ves-agent.name" . }} + release: {{ .Release.Name }} + template: + metadata: + labels: + app: {{ template "ves-agent.name" . }} + release: {{ .Release.Name }} + spec: + containers: + - name: {{ .Chart.Name }} + image: "{{ .Values.global.registry }}{{ .Values.image.repository }}:{{ tpl .Values.image.tag . }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + ports: + - name: http + containerPort: 80 + protocol: TCP + volumeMounts: + - name: agent-config + mountPath: /opt/ves-agent/config.properties + subPath: config.properties + + volumes: + - name: agent-config + configMap: + name: ves-agent-config diff --git a/helm-charts/ves-agent/templates/service.yaml b/helm-charts/ves-agent/templates/service.yaml new file mode 100644 index 0000000..fb8f7bf --- /dev/null +++ b/helm-charts/ves-agent/templates/service.yaml @@ -0,0 +1,33 @@ +# Copyright 2018- Cisco +# +# 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. + +apiVersion: v1 +kind: Service +metadata: + name: {{ template "ves-agent.name" . }} + labels: + app: {{ template "ves-agent.name" . }} + chart: {{ template "ves-agent.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + type: {{ .Values.service.type }} + ports: + - port: {{ .Values.service.port }} + targetPort: http + protocol: TCP + name: http + selector: + app: {{ template "ves-agent.name" . }} + release: {{ .Release.Name }} diff --git a/helm-charts/ves-agent/values.yaml b/helm-charts/ves-agent/values.yaml new file mode 100644 index 0000000..137031c --- /dev/null +++ b/helm-charts/ves-agent/values.yaml @@ -0,0 +1,41 @@ +# Copyright 2018- Cisco +# +# 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. + +replicaCount: 1 +nameOverride: "" + +image: + repository: 'opencord/ves-agent' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + +global: + registry: '' + +co_id: test_co +pod_id: test_pod + +onap: + ves_address: "onap" + ves_port: 30235 + +kafka: + address: "cord-kafka" + port: "9092" + alarms_topic: "voltha.alarms" + kpis_topic: "voltha.kpis" + +service: + type: ClusterIP + port: 8080 diff --git a/helm-charts/voltha/Chart.yaml b/helm-charts/voltha/Chart.yaml new file mode 100644 index 0000000..49d978e --- /dev/null +++ b/helm-charts/voltha/Chart.yaml @@ -0,0 +1,20 @@ +# Copyright 2017-present Open Networking Foundation +# +# 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: voltha +description: A Helm chart for Voltha based on K8S resources in Voltha project +icon: https://guide.opencord.org/logos/cord.svg + +version: 1.0.4 +appVersion: 1.6.0 diff --git a/helm-charts/voltha/requirements.yaml b/helm-charts/voltha/requirements.yaml new file mode 100644 index 0000000..0fde5ef --- /dev/null +++ b/helm-charts/voltha/requirements.yaml @@ -0,0 +1,20 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +dependencies: +- name: etcd-cluster + version: 0.1.2 + repository: file://../etcd-cluster + condition: etcd.cluster.enabled diff --git a/helm-charts/voltha/templates/05-namespace.yaml b/helm-charts/voltha/templates/05-namespace.yaml new file mode 100644 index 0000000..0944162 --- /dev/null +++ b/helm-charts/voltha/templates/05-namespace.yaml @@ -0,0 +1,18 @@ +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Namespace +metadata: + name: ingress-nginx diff --git a/helm-charts/voltha/templates/10-default-backend.yaml b/helm-charts/voltha/templates/10-default-backend.yaml new file mode 100644 index 0000000..6ada98f --- /dev/null +++ b/helm-charts/voltha/templates/10-default-backend.yaml @@ -0,0 +1,68 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: default-http-backend + labels: + app: default-http-backend + namespace: {{ .Values.global.namespace }} +spec: + replicas: 1 + template: + metadata: + labels: + app: default-http-backend + spec: + terminationGracePeriodSeconds: 60 + containers: + - name: default-http-backend + # Any image is permissable as long as: + # 1. It serves a 404 page at / + # 2. It serves 200 on a /healthz endpoint + image: {{ .Values.global.registry }}{{ .Values.images.http_backend.repository }}:{{ tpl .Values.images.http_backend.tag . }} + imagePullPolicy: {{ .Values.images.http_backend.pullPolicy }} + livenessProbe: + httpGet: + path: /healthz + port: 8080 + scheme: HTTP + initialDelaySeconds: 30 + timeoutSeconds: 5 + ports: + - containerPort: 8080 + resources: + limits: + cpu: 10m + memory: 20Mi + requests: + cpu: 10m + memory: 20Mi +--- + +apiVersion: v1 +kind: Service +metadata: + name: default-http-backend + namespace: {{ .Values.global.namespace }} + labels: + app: default-http-backend +spec: + ports: + - port: 80 + targetPort: 8080 + selector: + app: default-http-backend diff --git a/helm-charts/voltha/templates/20-configmap.yaml b/helm-charts/voltha/templates/20-configmap.yaml new file mode 100644 index 0000000..7ee406a --- /dev/null +++ b/helm-charts/voltha/templates/20-configmap.yaml @@ -0,0 +1,21 @@ +# Copyright 2017-present Open Networking Foundation +# +# 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. + +kind: ConfigMap +apiVersion: v1 +metadata: + name: nginx-configuration + namespace: {{ .Values.global.namespace }} + labels: + app: ingress-nginx diff --git a/helm-charts/voltha/templates/30-tcp-services-configmap.yaml b/helm-charts/voltha/templates/30-tcp-services-configmap.yaml new file mode 100644 index 0000000..d815835 --- /dev/null +++ b/helm-charts/voltha/templates/30-tcp-services-configmap.yaml @@ -0,0 +1,19 @@ +# Copyright 2017-present Open Networking Foundation +# +# 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. + +kind: ConfigMap +apiVersion: v1 +metadata: + name: tcp-services + namespace: {{ .Values.global.namespace }} diff --git a/helm-charts/voltha/templates/40-udp-services-configmap.yaml b/helm-charts/voltha/templates/40-udp-services-configmap.yaml new file mode 100644 index 0000000..380ab34 --- /dev/null +++ b/helm-charts/voltha/templates/40-udp-services-configmap.yaml @@ -0,0 +1,19 @@ +# Copyright 2017-present Open Networking Foundation +# +# 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. + +kind: ConfigMap +apiVersion: v1 +metadata: + name: udp-services + namespace: {{ .Values.global.namespace }} diff --git a/helm-charts/voltha/templates/50-rbac.yaml b/helm-charts/voltha/templates/50-rbac.yaml new file mode 100644 index 0000000..66b6c71 --- /dev/null +++ b/helm-charts/voltha/templates/50-rbac.yaml @@ -0,0 +1,147 @@ +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ServiceAccount +metadata: + name: nginx-ingress-serviceaccount + namespace: {{ .Values.global.namespace }} + +--- + +apiVersion: rbac.authorization.k8s.io/v1beta1 +kind: ClusterRole +metadata: + name: nginx-ingress-clusterrole +rules: + - apiGroups: + - "" + resources: + - configmaps + - endpoints + - nodes + - pods + - secrets + verbs: + - list + - watch + - apiGroups: + - "" + resources: + - nodes + verbs: + - get + - apiGroups: + - "" + resources: + - services + verbs: + - get + - list + - watch + - apiGroups: + - "extensions" + resources: + - ingresses + verbs: + - get + - list + - watch + - apiGroups: + - "" + resources: + - events + verbs: + - create + - patch + - apiGroups: + - "extensions" + resources: + - ingresses/status + verbs: + - update + +--- + +apiVersion: rbac.authorization.k8s.io/v1beta1 +kind: Role +metadata: + name: nginx-ingress-role + namespace: {{ .Values.global.namespace }} +rules: + - apiGroups: + - "" + resources: + - configmaps + - pods + - secrets + - namespaces + verbs: + - get + - apiGroups: + - "" + resources: + - configmaps + resourceNames: + # Defaults to "-" + # Here: "-" + # This has to be adapted if you change either parameter + # when launching the nginx-ingress-controller. + - "ingress-controller-leader-nginx" + verbs: + - get + - update + - apiGroups: + - "" + resources: + - configmaps + verbs: + - create + - apiGroups: + - "" + resources: + - endpoints + verbs: + - get + +--- + +apiVersion: rbac.authorization.k8s.io/v1beta1 +kind: RoleBinding +metadata: + name: nginx-ingress-role-nisa-binding + namespace: {{ .Values.global.namespace }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: nginx-ingress-role +subjects: + - kind: ServiceAccount + name: nginx-ingress-serviceaccount + namespace: {{ .Values.global.namespace }} + +--- + +apiVersion: rbac.authorization.k8s.io/v1beta1 +kind: ClusterRoleBinding +metadata: + name: nginx-ingress-clusterrole-nisa-binding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: nginx-ingress-clusterrole +subjects: + - kind: ServiceAccount + name: nginx-ingress-serviceaccount + namespace: {{ .Values.global.namespace }} diff --git a/helm-charts/voltha/templates/54-namespace.yaml b/helm-charts/voltha/templates/54-namespace.yaml new file mode 100644 index 0000000..db72ff1 --- /dev/null +++ b/helm-charts/voltha/templates/54-namespace.yaml @@ -0,0 +1,23 @@ +# Copyright 2017-present Open Networking Foundation +# +# 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. + +# +# Observation: +# It appears that when a namespace is created, Kubernetes creates +# a ServiceAccount called "default" for that new namespace. +# +apiVersion: v1 +kind: Namespace +metadata: + name: {{ .Values.global.namespace }} diff --git a/helm-charts/voltha/templates/55-rbac.yaml b/helm-charts/voltha/templates/55-rbac.yaml new file mode 100644 index 0000000..16ee8b3 --- /dev/null +++ b/helm-charts/voltha/templates/55-rbac.yaml @@ -0,0 +1,111 @@ +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ServiceAccount +metadata: + name: voltha-serviceaccount + namespace: {{ .Values.global.namespace }} + +--- + +apiVersion: rbac.authorization.k8s.io/v1beta1 +kind: ClusterRole +metadata: + name: voltha-clusterrole +rules: + - apiGroups: + - '*' + resources: + - '*' + verbs: + - '*' + - nonResourceURLs: + - '*' + verbs: + - '*' + +--- + +apiVersion: rbac.authorization.k8s.io/v1beta1 +kind: Role +metadata: + name: voltha-role + namespace: {{ .Values.global.namespace }} +rules: + - apiGroups: + - "" + resources: + - configmaps + - pods + - secrets + - namespaces + verbs: + - get + - apiGroups: + - "" + resources: + - configmaps + resourceNames: + # Defaults to "-" + # Here: "-" + # This has to be adapted if you change either parameter + # when launching the voltha-controller. + - "ingress-controller-leader-nginx" + verbs: + - get + - update + - apiGroups: + - "" + resources: + - configmaps + verbs: + - create + - apiGroups: + - "" + resources: + - endpoints + verbs: + - get + +--- + +apiVersion: rbac.authorization.k8s.io/v1beta1 +kind: RoleBinding +metadata: + name: voltha-role-nisa-binding + namespace: {{ .Values.global.namespace }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: voltha-role +subjects: + - kind: ServiceAccount + name: voltha-serviceaccount + namespace: {{ .Values.global.namespace }} + +--- + +apiVersion: rbac.authorization.k8s.io/v1beta1 +kind: ClusterRoleBinding +metadata: + name: voltha-clusterrole-nisa-binding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: voltha-clusterrole +subjects: + - kind: ServiceAccount + name: voltha-serviceaccount + namespace: {{ .Values.global.namespace }} diff --git a/helm-charts/voltha/templates/60-cluster-ingress-nginx.yaml b/helm-charts/voltha/templates/60-cluster-ingress-nginx.yaml new file mode 100644 index 0000000..98517ee --- /dev/null +++ b/helm-charts/voltha/templates/60-cluster-ingress-nginx.yaml @@ -0,0 +1,88 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: nginx-ingress-controller + namespace: {{ .Values.global.namespace }} +spec: + replicas: 1 + selector: + matchLabels: + app: ingress-nginx + template: + metadata: + labels: + app: ingress-nginx + annotations: + prometheus.io/port: '10254' + prometheus.io/scrape: 'true' + spec: + serviceAccountName: nginx-ingress-serviceaccount + initContainers: + - command: + - sh + - -c + - sysctl -w net.core.somaxconn=32768; sysctl -w net.ipv4.ip_local_port_range="1024 65535" + image: {{ .Values.global.registry }}{{ .Values.images.ingress_controller_base.repository }}:{{ tpl .Values.images.ingress_controller_base.tag . }} + imagePullPolicy: {{ .Values.images.ingress_controller_base.pullPolicy }} + name: sysctl + securityContext: + privileged: true + containers: + - name: nginx-ingress-controller + image: {{ .Values.global.registry }}{{ .Values.images.ingress_controller.repository }}:{{ tpl .Values.images.ingress_controller.tag . }} + imagePullPolicy: {{ .Values.images.ingress_controller.pullPolicy }} + args: + - /nginx-ingress-controller + - --default-backend-service=$(POD_NAMESPACE)/default-http-backend + - --configmap=$(POD_NAMESPACE)/nginx-configuration + - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services + - --udp-services-configmap=$(POD_NAMESPACE)/udp-services + - --annotations-prefix=nginx.ingress.kubernetes.io + env: + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + ports: + - name: http + containerPort: 80 + - name: https + containerPort: 443 + livenessProbe: + failureThreshold: 3 + httpGet: + path: /healthz + port: 10254 + scheme: HTTP + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + readinessProbe: + failureThreshold: 3 + httpGet: + path: /healthz + port: 10254 + scheme: HTTP + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 diff --git a/helm-charts/voltha/templates/70-service-ingress-nginx.yaml b/helm-charts/voltha/templates/70-service-ingress-nginx.yaml new file mode 100644 index 0000000..3af54d2 --- /dev/null +++ b/helm-charts/voltha/templates/70-service-ingress-nginx.yaml @@ -0,0 +1,32 @@ +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Service +metadata: + name: ingress-nginx + namespace: {{ .Values.global.namespace }} +spec: + type: NodePort + selector: + app: ingress-nginx + ports: + - name: http + port: 80 + nodePort: 30080 + targetPort: http + - name: https + port: 443 + nodePort: 30443 + targetPort: https diff --git a/helm-charts/voltha/templates/80-ingress.yaml b/helm-charts/voltha/templates/80-ingress.yaml new file mode 100644 index 0000000..8f28775 --- /dev/null +++ b/helm-charts/voltha/templates/80-ingress.yaml @@ -0,0 +1,38 @@ +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: extensions/v1beta1 +kind: Ingress +metadata: + name: voltha-ingress + namespace: {{ .Values.global.namespace }} + annotations: + kubernetes.io/ingress.class: "nginx" + ingress.kubernetes.io/rewrite-target: / +spec: + rules: + - host: k8s-consul + http: + paths: + - path: / + backend: + serviceName: consul + servicePort: 8500 + - host: k8s-grafana + http: + paths: + - path: / + backend: + serviceName: grafana + servicePort: 8883 diff --git a/helm-charts/voltha/templates/_helpers.tpl b/helm-charts/voltha/templates/_helpers.tpl new file mode 100644 index 0000000..12d1cbb --- /dev/null +++ b/helm-charts/voltha/templates/_helpers.tpl @@ -0,0 +1,60 @@ +{{- /* +Copyright 2017-present Open Networking Foundation + +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. +*/ -}} + +{{- define "voltha-vcore.cmd" }} +- "voltha/voltha/main.py" +- "--etcd={{ .Values.etcdReleaseName }}.default.svc.cluster.local:2379" +- "--kafka={{ .Values.kafkaReleaseName }}.default.svc.cluster.local" +- "--rest-port=8880" +- "--grpc-port=50556" +- "--interface=eth1" +- "--backend=etcd" +- "--pon-subnet=10.38.0.0/12" +- "--ponsim-comm=grpc" +- "--core-number-extractor=^.*-([0-9]+)_.*$" +{{- end }} + +{{- define "logconfig.yml" }} +version: 1 + +formatters: + default: + format: '%(asctime)s.%(msecs)03d %(levelname)-8s %(threadName)s %(module)s.%(funcName)s %(message)s' + datefmt: '%Y%m%dT%H%M%S' + +handlers: + console: + class : logging.StreamHandler + formatter: default + stream: ext://sys.stdout + localRotatingFile: + class: logging.handlers.RotatingFileHandler + filename: voltha.log + formatter: default + maxBytes: 2097152 + backupCount: 10 + kafka: + class: kafkaloghandler.KafkaLogHandler + bootstrap_servers: + - "{{ .KafkaServer }}" + topic: "voltha.log.{{ .KafkaTopic }}" + +loggers: + '': + handlers: [console, localRotatingFile, kafka] + level: {{ .loglevel }} + propagate: False +{{- end }} diff --git a/helm-charts/voltha/templates/alarm-generator.yaml b/helm-charts/voltha/templates/alarm-generator.yaml new file mode 100644 index 0000000..f5ef095 --- /dev/null +++ b/helm-charts/voltha/templates/alarm-generator.yaml @@ -0,0 +1,48 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +{{- if .Values.alarm_generator_enable }} +apiVersion: apps/v1beta1 +kind: Deployment +metadata: + name: alarm-generator + namespace: {{ .Values.global.namespace }} + serviceAccountName: {{ .Values.global.namespace }}-serviceaccount +spec: + replicas: {{ .Values.replicas.alarm_generator }} + template: + metadata: + labels: + app: alarm-generator + annotations: + cni: "calico" + spec: + serviceAccountName: {{ .Values.global.namespace }}-serviceaccount + containers: + - name: alarm-generator + image: {{ .Values.global.registry }}{{ .Values.images.alarm_generator.repository }}:{{ tpl .Values.images.alarm_generator.tag . }} + imagePullPolicy: {{ .Values.images.alarm_generator.pullPolicy }} + env: + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + args: +{{ toYaml .Values.alarm_generator_args | indent 12 }} +{{- end }} diff --git a/helm-charts/voltha/templates/envoy_for_etcd.yaml b/helm-charts/voltha/templates/envoy_for_etcd.yaml new file mode 100644 index 0000000..5966076 --- /dev/null +++ b/helm-charts/voltha/templates/envoy_for_etcd.yaml @@ -0,0 +1,73 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Service +metadata: + name: voltha + namespace: {{ .Values.global.namespace }} + serviceAccountName: {{ .Values.global.namespace }}-serviceaccount + labels: + name: voltha +spec: + type: {{ .Values.services.envoy.serviceType }} +{{ toYaml .Values.services.envoy.serviceInfo | indent 2 }} + selector: + app: voltha +--- +apiVersion: apps/v1beta1 +kind: Deployment +metadata: + name: voltha + namespace: {{ .Values.global.namespace }} +spec: + replicas: {{ .Values.replicas.envoy_for_etcd }} + template: + metadata: + labels: + app: voltha + spec: + serviceAccountName: {{ .Values.global.namespace }}-serviceaccount + containers: + - name: voltha + image: {{ .Values.global.registry }}{{ .Values.images.envoy_for_etcd.repository }}:{{ tpl .Values.images.envoy_for_etcd.tag . }} + imagePullPolicy: {{ .Values.images.envoy_for_etcd.pullPolicy }} + env: + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + args: + - "/usr/local/bin/envoyd" + - "-envoy-cfg-template=/envoy/voltha-grpc-proxy.template.json" + - "-envoy-config=/envoy/voltha-grpc-proxy.json" + - "-kv=etcd" + - "-kv-svc-name={{ .Values.etcdReleaseName }}.default.svc.cluster.local" + - "-kv-port=2379" + ports: + - containerPort: 8882 + name: rest-port + - containerPort: 8001 + name: mystery-port + - containerPort: 8443 + name: mystery2-port + - containerPort: 50555 + name: grpc-port + + diff --git a/helm-charts/voltha/templates/freeradius-config.yaml b/helm-charts/voltha/templates/freeradius-config.yaml new file mode 100644 index 0000000..92229d8 --- /dev/null +++ b/helm-charts/voltha/templates/freeradius-config.yaml @@ -0,0 +1,30 @@ +# Copyright 2017-present Open Networking Foundation +# +# 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. + +{{- if .Values.freeradius.enabled }} +apiVersion: v1 +data: + clients.conf: | + client 0.0.0.0/0 { + secret = SECRET + } + users: | + user Cleartext-Password := "password", MS-CHAP-Use-NTLM-Auth := 0 + +kind: ConfigMap +metadata: + name: freeradius-config + namespace: {{ .Values.global.namespace }} + serviceAccountName: {{ .Values.global.namespace }}-serviceaccount +{{- end}} diff --git a/helm-charts/voltha/templates/freeradius.yaml b/helm-charts/voltha/templates/freeradius.yaml new file mode 100644 index 0000000..ef86b16 --- /dev/null +++ b/helm-charts/voltha/templates/freeradius.yaml @@ -0,0 +1,95 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +{{- if .Values.freeradius.enabled }} +apiVersion: v1 +kind: Service +metadata: + name: freeradius + namespace: {{ .Values.global.namespace }} + serviceAccountName: {{ .Values.global.namespace }}-serviceaccount + labels: + name: freeradius +spec: + clusterIP: None + ports: + - name: radius-auth + protocol: UDP + port: 1812 + targetPort: 1812 + - name: radius-acc + protocol: UDP + port: 1813 + targetPort: 1813 + - name: radius + port: 18120 + targetPort: 18120 + selector: + app: freeradius +--- +apiVersion: apps/v1beta1 +kind: Deployment +metadata: + name: freeradius + namespace: {{ .Values.global.namespace }} + serviceAccountName: {{ .Values.global.namespace }}-serviceaccount +spec: + replicas: 1 + template: + metadata: + labels: + app: freeradius + annotations: + cni: "calico" + spec: + serviceAccountName: {{ .Values.global.namespace }}-serviceaccount + containers: + - name: freeradius + image: {{ .Values.global.registry }}{{ .Values.images.freeradius.repository }}:{{ tpl .Values.images.freeradius.tag . }} + imagePullPolicy: {{ .Values.images.freeradius.pullPolicy }} + env: + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: RADIUS_LISTEN_IP + value: "*" + - name: USERS_FILE + value: "/etc/raddb/users" + - name: RADIUS_CLIENTS + value: "SECRET@0.0.0.0/0" + ports: + - containerPort: 1812 + name: radauth-port + - containerPort: 1813 + name: radacc-port + - containerPort: 18120 + name: radius-port + volumeMounts: + - name: freeradius-config + mountPath: /etc/raddb/clients.conf + subPath: clients.conf + - name: freeradius-config + mountPath: /etc/raddb/users + subPath: users + volumes: + - name: freeradius-config + configMap: + name: freeradius-config +{{- end}} diff --git a/helm-charts/voltha/templates/logconfigmaps.yaml b/helm-charts/voltha/templates/logconfigmaps.yaml new file mode 100644 index 0000000..62e8109 --- /dev/null +++ b/helm-charts/voltha/templates/logconfigmaps.yaml @@ -0,0 +1,48 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. +apiVersion: v1 +kind: ConfigMap +metadata: + name: vcore-logconfig + namespace: {{ .Values.global.namespace }} + serviceAccountName: {{ .Values.global.namespace }}-serviceaccount +data: + logconfig: | + {{- $data := dict "KafkaServer" (printf "%s.default:9092" .Values.kafkaReleaseName) "KafkaTopic" "vcore" "loglevel" .Values.loglevel }} +{{ include "logconfig.yml" $data | indent 4 }} + +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: netconf-logconfig + namespace: {{ .Values.global.namespace }} + serviceAccountName: {{ .Values.global.namespace }}-serviceaccount +data: + logconfig: | +{{- $data := dict "KafkaServer" (printf "%s.default:9092" .Values.kafkaReleaseName) "KafkaTopic" "netconf" "loglevel" .Values.loglevel }} +{{ include "logconfig.yml" $data | indent 4 }} + +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: ofagent-logconfig + namespace: {{ .Values.global.namespace }} + serviceAccountName: {{ .Values.global.namespace }}-serviceaccount +data: + logconfig: | +{{- $data := dict "KafkaServer" (printf "%s.default:9092" .Values.kafkaReleaseName) "KafkaTopic" "ofagent" "loglevel" .Values.loglevel }} +{{ include "logconfig.yml" $data | indent 4 }} diff --git a/helm-charts/voltha/templates/netconf.yaml b/helm-charts/voltha/templates/netconf.yaml new file mode 100644 index 0000000..7aa571b --- /dev/null +++ b/helm-charts/voltha/templates/netconf.yaml @@ -0,0 +1,68 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Service +metadata: + name: netconf + namespace: {{ .Values.global.namespace }} + serviceAccountName: {{ .Values.global.namespace }}-serviceaccount +spec: + selector: + app: netconf + clusterIP: None + ports: + - port: 830 + targetPort: 830 +--- +apiVersion: apps/v1beta1 +kind: Deployment +metadata: + name: netconf + namespace: {{ .Values.global.namespace }} + serviceAccountName: {{ .Values.global.namespace }}-serviceaccount +spec: + replicas: {{ .Values.replicas.netconf }} + template: + metadata: + labels: + app: netconf + annotations: + cni: "calico" + spec: + serviceAccountName: {{ .Values.global.namespace }}-serviceaccount + terminationGracePeriodSeconds: 10 + containers: + - name: netconf + image: {{ .Values.global.registry }}{{ .Values.images.netconf.repository }}:{{ tpl .Values.images.netconf.tag . }} + imagePullPolicy: {{ .Values.images.netconf.pullPolicy }} + ports: + - containerPort: 830 + env: + - name: NETCONF_PORT + value: "830" + args: +{{ toYaml .Values.netconf_args | indent 12}} + volumeMounts: + - name: netconf-logconfig-vol + mountPath: /netconf/netconf/logconfig.yml + subPath: logconfig.yml + volumes: + - name: netconf-logconfig-vol + configMap: + name: netconf-logconfig + items: + - key: logconfig + path: logconfig.yml diff --git a/helm-charts/voltha/templates/ofagent.yaml b/helm-charts/voltha/templates/ofagent.yaml new file mode 100644 index 0000000..c70f408 --- /dev/null +++ b/helm-charts/voltha/templates/ofagent.yaml @@ -0,0 +1,54 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: apps/v1beta1 +kind: Deployment +metadata: + name: ofagent + namespace: {{ .Values.global.namespace }} + serviceAccountName: {{ .Values.global.namespace }}-serviceaccount +spec: + replicas: {{ .Values.replicas.ofagent }} + template: + metadata: + labels: + app: ofagent + annotations: + cni: "calico" + spec: + serviceAccountName: {{ .Values.global.namespace }}-serviceaccount + terminationGracePeriodSeconds: 10 + containers: + - name: ofagent + image: {{ .Values.global.registry }}{{ .Values.images.ofagent.repository }}:{{ tpl .Values.images.ofagent.tag . }} + imagePullPolicy: {{ .Values.images.ofagent.pullPolicy }} + env: + - name: NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + args: +{{ toYaml .Values.ofagent_args | indent 12 }} + volumeMounts: + - name: ofagent-logconfig-vol + mountPath: /ofagent/ofagent/logconfig.yml + subPath: logconfig.yml + volumes: + - name: ofagent-logconfig-vol + configMap: + name: ofagent-logconfig + items: + - key: logconfig + path: logconfig.yml diff --git a/helm-charts/voltha/templates/vcli.yaml b/helm-charts/voltha/templates/vcli.yaml new file mode 100644 index 0000000..2077705 --- /dev/null +++ b/helm-charts/voltha/templates/vcli.yaml @@ -0,0 +1,69 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Service +metadata: + name: vcli + namespace: {{ .Values.global.namespace }} + serviceAccountName: {{ .Values.global.namespace }}-serviceaccount + labels: + name: vcli +spec: + type: NodePort + ports: + - name: ssh + port: 5022 + targetPort: 22 + nodePort: {{ .Values.node_ports.vcli_port }} + selector: + app: vcli +--- +apiVersion: apps/v1beta1 +kind: Deployment +metadata: + name: vcli + namespace: {{ .Values.global.namespace }} + serviceAccountName: {{ .Values.global.namespace }}-serviceaccount +spec: + replicas: {{ .Values.replicas.vcli }} + template: + metadata: + labels: + app: vcli + annotations: + cni: "calico" + spec: + serviceAccountName: {{ .Values.global.namespace }}-serviceaccount + containers: + - name: vcli + image: {{ .Values.global.registry }}{{ .Values.images.vcli.repository }}:{{ tpl .Values.images.vcli.tag . }} + imagePullPolicy: {{ .Values.images.vcli.pullPolicy }} + env: + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + args: +{{ toYaml .Values.vcli_args | indent 12 }} + ports: + - containerPort: 22 + name: ssh-port + + diff --git a/helm-charts/voltha/templates/vcore_for_etcd.yaml b/helm-charts/voltha/templates/vcore_for_etcd.yaml new file mode 100644 index 0000000..5ea1d42 --- /dev/null +++ b/helm-charts/voltha/templates/vcore_for_etcd.yaml @@ -0,0 +1,90 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Service +metadata: + name: vcore + namespace: {{ .Values.global.namespace }} + serviceAccountName: {{ .Values.global.namespace }}-serviceaccount + labels: + name: vcore +spec: + clusterIP: None + ports: + - name: rest + port: 8880 + targetPort: 8880 + - name: mystery + port: 18880 + targetPort: 18880 + - name: grpc + port: 50556 + targetPort: 50556 + selector: + app: vcore +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: vcore + namespace: {{ .Values.global.namespace }} + serviceAccountName: {{ .Values.global.namespace }}-serviceaccount +spec: + serviceName: vcore + replicas: {{ .Values.replicas.vcore }} + updateStrategy: + type: RollingUpdate + selector: + matchLabels: + app: vcore + template: + metadata: + labels: + app: vcore + annotations: + cni: "calico" + spec: + terminationGracePeriodSeconds: 0 + serviceAccountName: {{ .Values.global.namespace }}-serviceaccount + containers: + - name: voltha + image: {{ .Values.global.registry }}{{ .Values.images.vcore.repository }}:{{ tpl .Values.images.vcore.tag . }} + imagePullPolicy: {{ .Values.images.vcore.pullPolicy }} + env: + - name: NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + args: +{{ include "voltha-vcore.cmd" . | indent 12 }} + ports: + - containerPort: 8880 + name: rest-port + - containerPort: 18880 + name: mystery-port + - containerPort: 50556 + name: grpc-port + volumeMounts: + - name: vcore-logconfig-vol + mountPath: /voltha/voltha/logconfig.yml + subPath: logconfig.yml + volumes: + - name: vcore-logconfig-vol + configMap: + name: vcore-logconfig + items: + - key: logconfig + path: logconfig.yml diff --git a/helm-charts/voltha/values.yaml b/helm-charts/voltha/values.yaml new file mode 100644 index 0000000..3aa83fd --- /dev/null +++ b/helm-charts/voltha/values.yaml @@ -0,0 +1,144 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +replicas: + vcore: 1 + vcli: 1 + ofagent: 1 + netconf: 1 + envoy_for_etcd: 1 + alarm_generator: 1 + +node_ports: + vcli_port: 30110 + +services: + envoy: + serviceType: NodePort + serviceInfo: + ports: + - name: rest + port: 8882 + targetPort: 8882 + nodePort: 30125 + - name: mystery + port: 8001 + targetPort: 8001 + - name: mystery2 + port: 8443 + targetPort: 8443 + nodePort: 32443 + - name: grpc + port: 50555 + targetPort: 50555 + +etcd: + cluster: + enabled: true + +freeradius: + enabled: true + +kafkaReleaseName: cord-kafka +etcdReleaseName: etcd-cluster + +loglevel: "DEBUG" + +images: + vcore: + repository: 'voltha/voltha-voltha' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + + vcli: + repository: 'voltha/voltha-cli' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + + ofagent: + repository: 'voltha/voltha-ofagent' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + + netconf: + repository: 'voltha/voltha-netconf' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + + envoy_for_etcd: + repository: 'voltha/voltha-envoy' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + + alarm_generator: + repository: 'voltha/voltha-alarm-generator' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + + freeradius: + repository: 'tpdock/freeradius' + tag: '2.2.9' + pullPolicy: 'Always' + + http_backend: + repository: 'gcr.io/google_containers/defaultbackend' + tag: '1.4' + pullPolicy: 'Always' + + ingress_controller: + repository: 'quay.io/kubernetes-ingress-controller/nginx-ingress-controller' + tag: '0.10.2' + pullPolicy: 'Always' + + ingress_controller_base: + repository: 'alpine' + tag: '3.6' + pullPolicy: 'Always' + +# Need the namespace global for kafka +global: + namespace: voltha + registry: '' + +vcli_args: +- "/cli/cli/setup.sh" +- "-C consul:8500" +- "-g voltha:50555" +- "-s voltha:18880" +- "-G" + +ofagent_args: +- "/ofagent/ofagent/main.py" +- "--consul=consul.$(NAMESPACE).svc.cluster.local:8500" +- "--controller=onos-openflow.default.svc.cluster.local:6653" +- "--grpc-endpoint=vcore.$(NAMESPACE).svc.cluster.local:50556" + +netconf_args: +- "/netconf/netconf/main.py" +- "--consul=consul:8500" +- "--grpc-endpoint=voltha:50555" + +# set alarm_generator_enable to true to enable alarm generator container. +# uncomment the intf_id and onu_id arguments if no olt is physically present, and a fake onu_id should be used. + +alarm_generator_enable: false +alarm_generator_args: +- "--consul=consul:8500" +- "--grpc-endpoint=voltha:50555" +- "--global_request" +- "--rate=1" +- "--duration=2" +#- "--intf_id=0" +#- "--onu_id=00012bc90d6552dd" diff --git a/helm-charts/workflows/att-workflow/Chart.yaml b/helm-charts/workflows/att-workflow/Chart.yaml new file mode 100644 index 0000000..2cc4f97 --- /dev/null +++ b/helm-charts/workflows/att-workflow/Chart.yaml @@ -0,0 +1,23 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +name: att-workflow +description: A Helm chart for XOS's "att-workflow" +icon: https://guide.opencord.org/logos/cord.svg +version: 1.2.1 + +# xosproject/tosca-loader version +appVersion: 1.3.0 diff --git a/helm-charts/workflows/att-workflow/requirements.yaml b/helm-charts/workflows/att-workflow/requirements.yaml new file mode 100644 index 0000000..3f9d627 --- /dev/null +++ b/helm-charts/workflows/att-workflow/requirements.yaml @@ -0,0 +1,19 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +dependencies: +- name: att-workflow-driver + version: 1.1.0 + repository: file://../../xos-services/att-workflow-driver diff --git a/helm-charts/workflows/att-workflow/templates/_helpers.tpl b/helm-charts/workflows/att-workflow/templates/_helpers.tpl new file mode 100644 index 0000000..6f83543 --- /dev/null +++ b/helm-charts/workflows/att-workflow/templates/_helpers.tpl @@ -0,0 +1,47 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{/* +Expand the name of the chart. +*/}} +{{- define "att-workflow.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "att-workflow.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "att-workflow.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} diff --git a/helm-charts/workflows/att-workflow/templates/_tosca.tpl b/helm-charts/workflows/att-workflow/templates/_tosca.tpl new file mode 100644 index 0000000..073a5f3 --- /dev/null +++ b/helm-charts/workflows/att-workflow/templates/_tosca.tpl @@ -0,0 +1,129 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} + +{{- define "att-workflow.serviceGraphTosca" -}} +tosca_definitions_version: tosca_simple_yaml_1_0 +imports: + - custom_types/attworkflowdriverservice.yaml + - custom_types/voltservice.yaml + - custom_types/servicedependency.yaml + - custom_types/servicegraphconstraint.yaml +description: att-workflow-driver service graph +topology_template: + node_templates: + +# These services must be defined before loading the graph + + service#volt: + type: tosca.nodes.VOLTService + properties: + name: volt + must-exist: true + + service#att-workflow-driver: + type: tosca.nodes.AttWorkflowDriverService + properties: + name: att-workflow-driver + must-exist: true + + service_dependency#workflow_volt: + type: tosca.nodes.ServiceDependency + properties: + connect_method: none + requirements: + - subscriber_service: + node: service#att-workflow-driver + relationship: tosca.relationships.BelongsToOne + - provider_service: + node: service#volt + relationship: tosca.relationships.BelongsToOne + + constraints: + type: tosca.nodes.ServiceGraphConstraint + properties: + constraints: '[[null, "rcord", null], [null, "volt", null], ["onos", "fabric-crossconnect", "att-workflow-driver"], ["fabric", null, null]]' +{{- end -}} + +{{- define "att-workflow.onosTosca" -}} +tosca_definitions_version: tosca_simple_yaml_1_0 + +imports: + - custom_types/onosapp.yaml + - custom_types/onosservice.yaml + - custom_types/serviceinstanceattribute.yaml + +description: Configures workflow-specific ONOS apps + +topology_template: + node_templates: + + service#onos: + type: tosca.nodes.ONOSService + properties: + name: onos + must-exist: true + + onos_app#aaa: + type: tosca.nodes.ONOSApp + properties: + name: aaa + app_id: org.opencord.aaa + url: {{ .Values.aaaAppUrl }} + version: {{ .Values.aaaAppVersion }} + dependencies: org.opencord.sadis + requirements: + - owner: + node: service#onos + relationship: tosca.relationships.BelongsToOne + + aaa-config-attr: + type: tosca.nodes.ServiceInstanceAttribute + properties: + name: /onos/v1/network/configuration/apps/org.opencord.aaa + value: > + { + "AAA" : { + "radiusConnectionType" : "socket", + "radiusHost" : "freeradius.voltha.svc.cluster.local", + "radiusServerPort" : "1812", + "radiusSecret" : "SECRET" + } + } + requirements: + - service_instance: + node: onos_app#aaa + relationship: tosca.relationships.BelongsToOne + + onos_app#olt: + type: tosca.nodes.ONOSApp + properties: + name: olt + must-exist: true + + olt-config-attr: + type: tosca.nodes.ServiceInstanceAttribute + properties: + name: /onos/v1/configuration/org.opencord.olt.impl.Olt?preset=true + value: > + { + "enableDhcpOnProvisioning" : true + } + requirements: + - service_instance: + node: onos_app#olt + relationship: tosca.relationships.BelongsToOne +{{- end -}} diff --git a/helm-charts/workflows/att-workflow/templates/tosca-configmap.yaml b/helm-charts/workflows/att-workflow/templates/tosca-configmap.yaml new file mode 100644 index 0000000..ec4a064 --- /dev/null +++ b/helm-charts/workflows/att-workflow/templates/tosca-configmap.yaml @@ -0,0 +1,27 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: att-workflow-tosca +data: + 010-fixtures.yaml: | +{{ include "att-workflow-driver.serviceTosca" (index .Values "att-workflow-driver") | indent 4 }} + 100-onos-apps.yaml: | +{{ include "att-workflow.onosTosca" . | indent 4 }} + 300-service-graph.yaml: | +{{ include "att-workflow.serviceGraphTosca" . | indent 4 }} diff --git a/helm-charts/workflows/att-workflow/templates/tosca-job.yaml b/helm-charts/workflows/att-workflow/templates/tosca-job.yaml new file mode 100644 index 0000000..a51aaf7 --- /dev/null +++ b/helm-charts/workflows/att-workflow/templates/tosca-job.yaml @@ -0,0 +1,55 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: batch/v1 +kind: Job +metadata: + name: {{ template "att-workflow.fullname" . }}-tosca-loader + labels: + app: {{ template "att-workflow.name" . }} + chart: {{ template "att-workflow.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + backoffLimit: 12 + template: + metadata: + labels: + app: {{ template "att-workflow.name" . }} + release: {{ .Release.Name }} + annotations: + checksum/config: {{ include (print $.Template.BasePath "/tosca-configmap.yaml") . | sha256sum }} + spec: + restartPolicy: OnFailure + containers: + - name: {{ .Chart.Name }}-tosca-loader + image: {{ .Values.global.registry }}{{ .Values.images.tosca_loader.repository }}:{{ tpl .Values.images.tosca_loader.tag . }} + imagePullPolicy: {{ .Values.images.tosca_loader.pullPolicy }} + env: + - name: XOS_USER + value: {{ .Values.xosAdminUser }} + - name: XOS_PASSWD + valueFrom: + secretKeyRef: + name: xos-admin-passwd-secret + key: password + volumeMounts: + - name: att-workflow-tosca + mountPath: /opt/tosca + volumes: + - name: att-workflow-tosca + configMap: + name: att-workflow-tosca diff --git a/helm-charts/workflows/att-workflow/values.yaml b/helm-charts/workflows/att-workflow/values.yaml new file mode 100644 index 0000000..88e4da4 --- /dev/null +++ b/helm-charts/workflows/att-workflow/values.yaml @@ -0,0 +1,41 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Default values for the att-workflow profile. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + + +nameOverride: "" +fullnameOverride: "" + +images: + tosca_loader: + repository: 'xosproject/tosca-loader' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + +global: + registry: "" + +att-workflow-driver: + kafkaService: "cord-platform-kafka" + +xosAdminUser: "admin@opencord.org" +xosAdminPassword: "letmein" + +# ONOS applications +aaaAppUrl: "https://oss.sonatype.org/service/local/repositories/releases/content/org/opencord/aaa/1.8.0/aaa-1.8.0.oar" +aaaAppVersion: "1.8.0" diff --git a/helm-charts/workflows/tt-workflow/Chart.yaml b/helm-charts/workflows/tt-workflow/Chart.yaml new file mode 100644 index 0000000..e95c96b --- /dev/null +++ b/helm-charts/workflows/tt-workflow/Chart.yaml @@ -0,0 +1,23 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +name: tt-workflow +description: A Helm chart for XOS's "tt-workflow" +icon: https://guide.opencord.org/logos/cord.svg +version: 0.1.2-dev + +# xosproject/tosca-loader version +appVersion: 1.3.0 diff --git a/helm-charts/workflows/tt-workflow/requirements.yaml b/helm-charts/workflows/tt-workflow/requirements.yaml new file mode 100644 index 0000000..f02ee70 --- /dev/null +++ b/helm-charts/workflows/tt-workflow/requirements.yaml @@ -0,0 +1,19 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +dependencies: +- name: tt-workflow-driver + version: 0.1.0 + repository: file://../../xos-services/tt-workflow-driver diff --git a/helm-charts/workflows/tt-workflow/templates/_helpers.tpl b/helm-charts/workflows/tt-workflow/templates/_helpers.tpl new file mode 100644 index 0000000..c69782b --- /dev/null +++ b/helm-charts/workflows/tt-workflow/templates/_helpers.tpl @@ -0,0 +1,47 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{/* +Expand the name of the chart. +*/}} +{{- define "tt-workflow.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "tt-workflow.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "tt-workflow.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} diff --git a/helm-charts/workflows/tt-workflow/templates/_tosca.tpl b/helm-charts/workflows/tt-workflow/templates/_tosca.tpl new file mode 100644 index 0000000..0888759 --- /dev/null +++ b/helm-charts/workflows/tt-workflow/templates/_tosca.tpl @@ -0,0 +1,99 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} + +{{- define "tt-workflow.serviceGraphTosca" -}} +tosca_definitions_version: tosca_simple_yaml_1_0 +imports: + - custom_types/ttworkflowdriverservice.yaml + - custom_types/voltservice.yaml + - custom_types/servicedependency.yaml + - custom_types/servicegraphconstraint.yaml +description: tt-workflow-driver service graph +topology_template: + node_templates: + +# These services must be defined before loading the graph + + service#volt: + type: tosca.nodes.VOLTService + properties: + name: volt + must-exist: true + + service#tt-workflow-driver: + type: tosca.nodes.TtWorkflowDriverService + properties: + name: tt-workflow-driver + must-exist: true + + service_dependency#workflow_volt: + type: tosca.nodes.ServiceDependency + properties: + connect_method: none + requirements: + - subscriber_service: + node: service#tt-workflow-driver + relationship: tosca.relationships.BelongsToOne + - provider_service: + node: service#volt + relationship: tosca.relationships.BelongsToOne + + constraints: + type: tosca.nodes.ServiceGraphConstraint + properties: + constraints: '[[null, "rcord", null], [null, "volt", null], ["onos", "fabric-crossconnect", "tt-workflow-driver"], ["fabric", null, null]]' +{{- end -}} + +{{- define "tt-workflow.onosTosca" -}} +tosca_definitions_version: tosca_simple_yaml_1_0 + +imports: + - custom_types/onosapp.yaml + - custom_types/onosservice.yaml + - custom_types/serviceinstanceattribute.yaml + +description: Configures workflow-specific ONOS apps + +topology_template: + node_templates: + + service#onos: + type: tosca.nodes.ONOSService + properties: + name: onos + must-exist: true + + onos_app#olt: + type: tosca.nodes.ONOSApp + properties: + name: olt + must-exist: true + + olt-config-attr: + type: tosca.nodes.ServiceInstanceAttribute + properties: + name: /onos/v1/configuration/org.opencord.olt.impl.Olt?preset=true + value: > + { + "enableDhcpOnProvisioning" : true, + "enableEapol" : false + } + requirements: + - service_instance: + node: onos_app#olt + relationship: tosca.relationships.BelongsToOne +{{- end -}} diff --git a/helm-charts/workflows/tt-workflow/templates/tosca-configmap.yaml b/helm-charts/workflows/tt-workflow/templates/tosca-configmap.yaml new file mode 100644 index 0000000..beb18bc --- /dev/null +++ b/helm-charts/workflows/tt-workflow/templates/tosca-configmap.yaml @@ -0,0 +1,27 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: tt-workflow-tosca +data: + 010-fixtures.yaml: | +{{ include "tt-workflow-driver.serviceTosca" (index .Values "tt-workflow-driver") | indent 4 }} + 100-onos-apps.yaml: | +{{ include "tt-workflow.onosTosca" . | indent 4 }} + 300-service-graph.yaml: | +{{ include "tt-workflow.serviceGraphTosca" . | indent 4 }} diff --git a/helm-charts/workflows/tt-workflow/templates/tosca-job.yaml b/helm-charts/workflows/tt-workflow/templates/tosca-job.yaml new file mode 100644 index 0000000..5596dbe --- /dev/null +++ b/helm-charts/workflows/tt-workflow/templates/tosca-job.yaml @@ -0,0 +1,55 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: batch/v1 +kind: Job +metadata: + name: {{ template "tt-workflow.fullname" . }}-tosca-loader + labels: + app: {{ template "tt-workflow.name" . }} + chart: {{ template "tt-workflow.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + backoffLimit: 12 + template: + metadata: + labels: + app: {{ template "tt-workflow.name" . }} + release: {{ .Release.Name }} + annotations: + checksum/config: {{ include (print $.Template.BasePath "/tosca-configmap.yaml") . | sha256sum }} + spec: + restartPolicy: OnFailure + containers: + - name: {{ .Chart.Name }}-tosca-loader + image: {{ .Values.global.registry }}{{ .Values.images.tosca_loader.repository }}:{{ tpl .Values.images.tosca_loader.tag . }} + imagePullPolicy: {{ .Values.images.tosca_loader.pullPolicy }} + env: + - name: XOS_USER + value: {{ .Values.xosAdminUser }} + - name: XOS_PASSWD + valueFrom: + secretKeyRef: + name: xos-admin-passwd-secret + key: password + volumeMounts: + - name: tt-workflow-tosca + mountPath: /opt/tosca + volumes: + - name: tt-workflow-tosca + configMap: + name: tt-workflow-tosca diff --git a/helm-charts/workflows/tt-workflow/values.yaml b/helm-charts/workflows/tt-workflow/values.yaml new file mode 100644 index 0000000..61cea53 --- /dev/null +++ b/helm-charts/workflows/tt-workflow/values.yaml @@ -0,0 +1,37 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Default values for the tt-workflow profile. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + + +nameOverride: "" +fullnameOverride: "" + +images: + tosca_loader: + repository: 'xosproject/tosca-loader' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + +global: + registry: "" + +tt-workflow-driver: + kafkaService: "cord-platform-kafka" + +xosAdminUser: "admin@opencord.org" +xosAdminPassword: "letmein" diff --git a/helm-charts/xos-core/Chart.yaml b/helm-charts/xos-core/Chart.yaml new file mode 100644 index 0000000..11bdbe7 --- /dev/null +++ b/helm-charts/xos-core/Chart.yaml @@ -0,0 +1,24 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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: xos-core +description: XOS - An Extensible Cloud Operating System +icon: https://guide.opencord.org/logos/xos.svg + +version: 3.0.2 + +# appVersion is of the xos-core containers. +# xos-tosca, xos-chameleon, and xos-api-tester are versioned in values.yaml +appVersion: 3.2.3 diff --git a/helm-charts/xos-core/pki/xos-CA.pem b/helm-charts/xos-core/pki/xos-CA.pem new file mode 100644 index 0000000..655dc29 --- /dev/null +++ b/helm-charts/xos-core/pki/xos-CA.pem @@ -0,0 +1,23 @@ +-----BEGIN CERTIFICATE----- +MIID1jCCAr6gAwIBAgIJAIWmwLL7nulVMA0GCSqGSIb3DQEBCwUAMHgxCzAJBgNV +BAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRMwEQYDVQQHDApNZW5sbyBQYXJr +MQwwCgYDVQQKDANPTkYxFTATBgNVBAsMDFRlc3RpbmcgT25seTEaMBgGA1UEAwwR +Q09SRCBUZXN0IFJvb3QgQ0EwHhcNMTgxMjE0MTgyNTE5WhcNMTkxMjE1MTgyNTE5 +WjB4MQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTETMBEGA1UEBwwK +TWVubG8gUGFyazEMMAoGA1UECgwDT05GMRUwEwYDVQQLDAxUZXN0aW5nIE9ubHkx +GjAYBgNVBAMMEUNPUkQgVGVzdCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEAokxdd5vyy83NPQYQK/wsz6VLrunv/3FNSbUv9dC4MC5zZyMd +oxrYCfM38rypbrB5PIVlFdndfDzoYORmlC9gxJnFUmAztyU2JIZrcxk1sQ+lBWj+ +Bytwh1TKT0OSfEWjB/LV1FGLAuspJGBn2T0E35bGhhzOL8Cgm0e8akeAfs2s9akO +Xcj+4osnAkXynKl+HhCTBkcrmg1YsTB3+0ug0vM5xuHMU5tVVKpn9DinZ3enuHle +ICyiMF8JyEibjGl0cjnGhw1lPzT7lsjxuoZhr3NaIlI/zUXBDTJbJ6T6gUa1Npa/ +lurbEn/9pUMQcUIOnIfzbmzVjPmd0AL9fEcAlQIDAQABo2MwYTAdBgNVHQ4EFgQU +xYhJSu6N6DF7C39G1hAvF7JOC54wHwYDVR0jBBgwFoAUxYhJSu6N6DF7C39G1hAv +F7JOC54wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcN +AQELBQADggEBAJc7J+ZVhp7ti+YN2Smv/jtz79NyF1J6Eb3M/BC/A5Eo8Cp2hklC +NI00+con2Dvvbmj6lOgKXPL6C8LgxiZ5gVDtSvK8zuoIzkIDod4IovxcwLrvlIH4 +BpG6Sm1d7EbwAHKFGc0qvVdRN48P884KnzW27eLtsdqrkUPuqz9Ph1JJmAzy3v5p +pKtL6zfn706pcad5NuAcoz0782T+wszHmBv0SBboLdo9NyUciJBQCjIDaSEOpqze +upzRp50aDMq3nxd7yZ3VGA52ECNQ4gWgWAHomDS22RdCHsedbUofnrl6TW88j+Aa ++4AJR9CmhoP1CnKHb5wVCBScw9T8gu3aLe0= +-----END CERTIFICATE----- diff --git a/helm-charts/xos-core/pki/xos-core.key b/helm-charts/xos-core/pki/xos-core.key new file mode 100644 index 0000000..61d1b95 --- /dev/null +++ b/helm-charts/xos-core/pki/xos-core.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEogIBAAKCAQEA2EuSUdVkDQBJsjf7ZK7NYOVlt6IR16TI3hXQYQr29ajvaHzJ +KRel7hRpy6m1JPy7lXNIF5ad2ooK5e7xxi8tiUGXJrTxchgeAslI2AJaNqsWP/iy +gGJ+UXnvqd1PGILpkucxumRlQEXEF77SVTSPvodffxsrp+Xt2LnNmn8a9RSJMV61 +uRSgFAvgpIlw2LEr6nS9QQLuN/E0uXihMFu5/MJNjjnWhmpVVfvraCAGLB1azU7p +2XC7XfmanNaNT2nUDVooXWp07J0JDeS+zQNzlNNHgyd36JGI7BVHDl7NBUucTfds +EQK1aYY5zgP+nt4zzZMmaVlS8oBJCBWq3j7g/wIDAQABAoIBAFITk0mUZSv90Plc +/vt8zZiYVBnz2TtwX3zO4E0C4SXlXjvTJm5+d8u5WVAcbQ3FDdWvckrpL6tvOKV6 +H6rp2ii8iAP7I6f8+N5rzUWS1vLpxz6tO+c1+OMoF0bpIQuXGdVR/+/QCw/xqXCt +S5ljoaxWKGnOQKmsua3FC/01gGBBIRtd5Vmn6m1R7IYQP6AZjNbE8trb7Q8TO66t +QK3h5oTv36hL7qC2a2L6WiSOOyul7f9wzn2/x6fyNW43nYV3jvf79nKuiv8ZkVjK +qYIlmLSlXwbq7N3eI6mcP6AqyeL9OFAkh0JBoiPsCND9sZV7KpiTieh8mUelxnQr +8qG4c7ECgYEA7HqZTjfhb04s0rihlbHJX7JOP407tOCZCI2QlNL+M29UpBgbx5z3 +jfX0hlj5Vkq/GWvMm288gpBgfKSzh29mpO21GEmWNFqsNdls+f0/DgWs0TYRe9uQ +w4CSfNpvx3LRmh2y0b7BaoDd6X5Rma533zmyiAuDcPZdHfbl+FVZ/+cCgYEA6iZw +kyp4hPRQXyavufXyF6Ej88k5BjtU5CqURcXKmJbP+SfDoHOH4V+erFsgeOl1TAAc +GTXGL4/d4xLBp78U0CgLm0k78kcuKXmKQ5AWeMkn4tPAbxEuqpi2ZrfLd0gE+T/q +mUiphmRL00qIymJQpopn1beAMsowy96L2cybUykCgYBipPmSYUkOryOPeykcUp9X +5f8yD24ak54CrVrkWedj+UrrcIsWB2pUs4afDDpmPqPcrNUa+ZnaNPOqyuGA232L +ywTB7uBTUoeHpv0IgxVsef2O/+jnK74Fb3qrzkrWfhTlHwJa8CGqlbr8DY9odhjW +6zCIA5V+56YMO9POdXwnfQKBgF2wedT45nZUh6A7C48+ENtRl+AhANc0gFg3jVKJ +vPHnTlokhgs6jwEn0Iaog8q9pzh8xsFzmdRIHYGRbLlhJMPRcit1Vy4vOxJPVnqI +OeWkn3gMQHBwkJqkNj/NhPU6dPsCjy08PNDQauKlbSyFwD2THc8O+JXZ/0JjztOc +If5ZAoGAAefyJ6cAs6p8QMBG0nYYtJMeW5cXwGhFMLJTW3B2qMVsDsOL2sp1T3ou +Emn2I02ogmtmmHNxOQY3kRQ5S0PPAraoXxywjB4BaH/VNJgdEntmWI1woPI8j2qq +8RCyi2O5T9YpO2cWRJSXGd6rNFmRQjM+FuznUpqe1BYxLT15bJw= +-----END RSA PRIVATE KEY----- diff --git a/helm-charts/xos-core/pki/xos-core.pem b/helm-charts/xos-core/pki/xos-core.pem new file mode 100644 index 0000000..92c26f2 --- /dev/null +++ b/helm-charts/xos-core/pki/xos-core.pem @@ -0,0 +1,93 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 4096 (0x1000) + Signature Algorithm: sha256WithRSAEncryption + Issuer: C=US, ST=California, L=Menlo Park, O=ONF, OU=Testing Only, CN=CORD Test Root CA + Validity + Not Before: Dec 14 18:25:19 2018 GMT + Not After : Dec 15 18:25:19 2019 GMT + Subject: C=US, ST=California, L=Menlo Park, O=ONF, OU=Testing Only, CN=xos-core + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:d8:4b:92:51:d5:64:0d:00:49:b2:37:fb:64:ae: + cd:60:e5:65:b7:a2:11:d7:a4:c8:de:15:d0:61:0a: + f6:f5:a8:ef:68:7c:c9:29:17:a5:ee:14:69:cb:a9: + b5:24:fc:bb:95:73:48:17:96:9d:da:8a:0a:e5:ee: + f1:c6:2f:2d:89:41:97:26:b4:f1:72:18:1e:02:c9: + 48:d8:02:5a:36:ab:16:3f:f8:b2:80:62:7e:51:79: + ef:a9:dd:4f:18:82:e9:92:e7:31:ba:64:65:40:45: + c4:17:be:d2:55:34:8f:be:87:5f:7f:1b:2b:a7:e5: + ed:d8:b9:cd:9a:7f:1a:f5:14:89:31:5e:b5:b9:14: + a0:14:0b:e0:a4:89:70:d8:b1:2b:ea:74:bd:41:02: + ee:37:f1:34:b9:78:a1:30:5b:b9:fc:c2:4d:8e:39: + d6:86:6a:55:55:fb:eb:68:20:06:2c:1d:5a:cd:4e: + e9:d9:70:bb:5d:f9:9a:9c:d6:8d:4f:69:d4:0d:5a: + 28:5d:6a:74:ec:9d:09:0d:e4:be:cd:03:73:94:d3: + 47:83:27:77:e8:91:88:ec:15:47:0e:5e:cd:05:4b: + 9c:4d:f7:6c:11:02:b5:69:86:39:ce:03:fe:9e:de: + 33:cd:93:26:69:59:52:f2:80:49:08:15:aa:de:3e: + e0:ff + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + 30:AC:5D:59:D7:FD:7D:47:BB:F1:EF:2F:22:2B:4B:D6:8E:66:54:69 + X509v3 Authority Key Identifier: + keyid:C5:88:49:4A:EE:8D:E8:31:7B:0B:7F:46:D6:10:2F:17:B2:4E:0B:9E + DirName:/C=US/ST=California/L=Menlo Park/O=ONF/OU=Testing Only/CN=CORD Test Root CA + serial:85:A6:C0:B2:FB:9E:E9:55 + + X509v3 Basic Constraints: + CA:FALSE + X509v3 Key Usage: critical + Digital Signature, Key Encipherment + X509v3 Extended Key Usage: + TLS Web Server Authentication + X509v3 Subject Alternative Name: + DNS:xos-core, DNS:xos-core.default, DNS:xos-core.default.svc.cluster.local + Signature Algorithm: sha256WithRSAEncryption + 15:cd:7b:ba:21:f0:79:30:8a:be:b9:04:d1:39:d8:ad:de:0f: + 44:eb:64:39:dc:79:7e:57:b7:29:36:a1:dc:66:7b:38:6d:55: + 89:98:d8:3a:eb:cb:8a:08:46:81:69:6a:95:b7:24:02:b1:55: + 3a:cf:0a:18:d5:15:92:77:7d:01:c4:f3:72:65:d9:1a:ef:1c: + dd:87:ab:eb:a3:1b:2e:a3:2c:e8:d9:7f:a9:a7:49:47:83:84: + 99:f7:ea:10:48:6b:3a:4b:be:c4:08:d3:ac:3f:b8:a7:a7:b6: + d6:74:d1:ad:c6:b1:75:42:d8:2b:5e:ee:ed:30:39:0f:f1:2d: + 30:24:1d:3d:46:4b:4b:db:d2:3c:d4:d2:68:ff:d9:29:1e:b4: + 8b:06:e4:c9:02:bd:23:02:36:1f:8d:1e:1e:8f:16:19:e4:17: + 34:8c:e1:a7:a6:25:0b:e8:b0:bd:f7:51:b8:1b:6f:fd:6a:3d: + 6b:09:9d:05:18:ac:77:02:62:bb:91:5a:15:79:d9:11:22:8a: + e9:b7:c3:b4:83:ab:5b:71:25:df:d0:e1:6a:ad:43:dc:5d:cb: + f5:5d:49:2b:53:25:8b:64:f8:33:44:df:d2:44:ec:03:72:32: + da:77:75:cf:67:83:be:3c:6e:75:72:2f:f3:31:39:7f:e3:60: + cb:0e:57:f8 +-----BEGIN CERTIFICATE----- +MIIEsDCCA5igAwIBAgICEAAwDQYJKoZIhvcNAQELBQAweDELMAkGA1UEBhMCVVMx +EzARBgNVBAgMCkNhbGlmb3JuaWExEzARBgNVBAcMCk1lbmxvIFBhcmsxDDAKBgNV +BAoMA09ORjEVMBMGA1UECwwMVGVzdGluZyBPbmx5MRowGAYDVQQDDBFDT1JEIFRl +c3QgUm9vdCBDQTAeFw0xODEyMTQxODI1MTlaFw0xOTEyMTUxODI1MTlaMG8xCzAJ +BgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRMwEQYDVQQHDApNZW5sbyBQ +YXJrMQwwCgYDVQQKDANPTkYxFTATBgNVBAsMDFRlc3RpbmcgT25seTERMA8GA1UE +AwwIeG9zLWNvcmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDYS5JR +1WQNAEmyN/tkrs1g5WW3ohHXpMjeFdBhCvb1qO9ofMkpF6XuFGnLqbUk/LuVc0gX +lp3aigrl7vHGLy2JQZcmtPFyGB4CyUjYAlo2qxY/+LKAYn5Ree+p3U8YgumS5zG6 +ZGVARcQXvtJVNI++h19/Gyun5e3Yuc2afxr1FIkxXrW5FKAUC+CkiXDYsSvqdL1B +Au438TS5eKEwW7n8wk2OOdaGalVV++toIAYsHVrNTunZcLtd+Zqc1o1PadQNWihd +anTsnQkN5L7NA3OU00eDJ3fokYjsFUcOXs0FS5xN92wRArVphjnOA/6e3jPNkyZp +WVLygEkIFarePuD/AgMBAAGjggFLMIIBRzAdBgNVHQ4EFgQUMKxdWdf9fUe78e8v +IitL1o5mVGkwgaoGA1UdIwSBojCBn4AUxYhJSu6N6DF7C39G1hAvF7JOC56hfKR6 +MHgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRMwEQYDVQQHDApN +ZW5sbyBQYXJrMQwwCgYDVQQKDANPTkYxFTATBgNVBAsMDFRlc3RpbmcgT25seTEa +MBgGA1UEAwwRQ09SRCBUZXN0IFJvb3QgQ0GCCQCFpsCy+57pVTAJBgNVHRMEAjAA +MA4GA1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATBJBgNVHREEQjBA +ggh4b3MtY29yZYIQeG9zLWNvcmUuZGVmYXVsdIIieG9zLWNvcmUuZGVmYXVsdC5z +dmMuY2x1c3Rlci5sb2NhbDANBgkqhkiG9w0BAQsFAAOCAQEAFc17uiHweTCKvrkE +0TnYrd4PROtkOdx5fle3KTah3GZ7OG1ViZjYOuvLighGgWlqlbckArFVOs8KGNUV +knd9AcTzcmXZGu8c3Yer66MbLqMs6Nl/qadJR4OEmffqEEhrOku+xAjTrD+4p6e2 +1nTRrcaxdULYK17u7TA5D/EtMCQdPUZLS9vSPNTSaP/ZKR60iwbkyQK9IwI2H40e +Ho8WGeQXNIzhp6YlC+iwvfdRuBtv/Wo9awmdBRisdwJiu5FaFXnZESKK6bfDtIOr +W3El39Dhaq1D3F3L9V1JK1Mli2T4M0Tf0kTsA3Iy2nd1z2eDvjxudXIv8zE5f+Ng +yw5X+A== +-----END CERTIFICATE----- diff --git a/helm-charts/xos-core/requirements.yaml b/helm-charts/xos-core/requirements.yaml new file mode 100644 index 0000000..bfa156f --- /dev/null +++ b/helm-charts/xos-core/requirements.yaml @@ -0,0 +1,23 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +dependencies: +- name: xos-db + version: 1.0.1 + repository: file://../xos-db +- name: xos-gui + version: 1.2.4 + repository: file://../xos-gui + condition: xos-gui.enabled diff --git a/helm-charts/xos-core/templates/50-rbac.yaml b/helm-charts/xos-core/templates/50-rbac.yaml new file mode 100644 index 0000000..7e983b4 --- /dev/null +++ b/helm-charts/xos-core/templates/50-rbac.yaml @@ -0,0 +1,35 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ServiceAccount +metadata: + name: kubernetes-synchronizer + +... +--- + +apiVersion: rbac.authorization.k8s.io/v1beta1 +kind: ClusterRoleBinding +metadata: + name: kubernetes-synchronizer-cluster-admin +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: cluster-admin +subjects: + - kind: ServiceAccount + name: kubernetes-synchronizer + namespace: default diff --git a/helm-charts/xos-core/templates/NOTES.txt b/helm-charts/xos-core/templates/NOTES.txt new file mode 100644 index 0000000..cb50ff5 --- /dev/null +++ b/helm-charts/xos-core/templates/NOTES.txt @@ -0,0 +1,4 @@ +Thank you for installing {{ .Chart.Name }}. + +Your release is named {{ .Release.Name }}. + diff --git a/helm-charts/xos-core/templates/_core.tpl b/helm-charts/xos-core/templates/_core.tpl new file mode 100644 index 0000000..fe59e60 --- /dev/null +++ b/helm-charts/xos-core/templates/_core.tpl @@ -0,0 +1,76 @@ +{{- /* +Copyright 2017-present Open Networking Foundation + +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. +*/ -}} + +{{- define "xos-core.config" }} +name: xos-core +xos_dir: /opt/xos +kafka_bootstrap_servers: + - {{ .Values.platformKafka }} +database: + name: {{ .Values.xosDBName | quote }} + username: {{ .Values.xosDBUser | quote }} + password: {{ .Values.xosDBPassword | quote }} +logging: + version: 1 + handlers: + console: + class: logging.StreamHandler + file: + class: logging.handlers.RotatingFileHandler + filename: /var/log/xos.log + maxBytes: 10485760 + backupCount: 5 + kafka: + class: kafkaloghandler.KafkaLogHandler + bootstrap_servers: + - {{ .Values.platformKafka }} + topic: xos.log.core + loggers: + '': + handlers: + - console + - file + - kafka + level: {{ .Values.loglevel }} +{{- end }} + +{{- define "xos-core.initial_data" }} +- model: core.Site + fields: + name: {{ .Values.cordSiteName | quote }} + abbreviated_name: {{ .Values.cordSiteName | quote }} + login_base: {{ .Values.cordSiteName | quote }} + site_url: "http://opencord.org/" + hosts_nodes: true + +- model: core.User + fields: + email: {{ .Values.xosAdminUser | quote }} + password: {{ .Values.xosAdminPassword | quote }} + firstname: {{ .Values.xosAdminFirstname | quote }} + lastname: {{ .Values.xosAdminLastname | quote }} + is_admin: true + relations: + site: + fields: + name: {{ .Values.cordSiteName | quote }} + model: core.Site +{{- end }} + +{{- define "xos-core.ca_cert_chain" }} +{{ (.Files.Get "pki/xos-CA.pem")}} +{{- end }} + diff --git a/helm-charts/xos-core/templates/_helpers.tpl b/helm-charts/xos-core/templates/_helpers.tpl new file mode 100644 index 0000000..f55e3be --- /dev/null +++ b/helm-charts/xos-core/templates/_helpers.tpl @@ -0,0 +1,24 @@ +{{- /* +Copyright 2017-present Open Networking Foundation + +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. +*/ -}} + +{{- define "xos-core.release_labels" }} +app: {{ printf "%s-%s" .Release.Name .Chart.Name | trunc 63 }} +chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }} +release: {{ .Release.Name }} +heritage: {{ .Release.Service }} +version: {{ .Chart.Version }} +{{- end }} + diff --git a/helm-charts/xos-core/templates/_tosca.tpl b/helm-charts/xos-core/templates/_tosca.tpl new file mode 100644 index 0000000..98e7d13 --- /dev/null +++ b/helm-charts/xos-core/templates/_tosca.tpl @@ -0,0 +1,43 @@ +{{- /* +Copyright 2017-present Open Networking Foundation + +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. +*/ -}} + +{{- define "xos-tosca.config" }} +name: xos-tosca +gprc_endpoint: "xos-core" +local_cert: /usr/local/share/ca-certificates/local_certs.crt +logging: + version: 1 + handlers: + console: + class: logging.StreamHandler + file: + class: logging.handlers.RotatingFileHandler + filename: /var/log/xos.log + maxBytes: 10485760 + backupCount: 5 + kafka: + class: kafkaloghandler.KafkaLogHandler + bootstrap_servers: + - {{ .Values.platformKafka }} + topic: xos.log.tosca + loggers: + '': + handlers: + - console + - file + - kafka + level: DEBUG +{{- end }} diff --git a/helm-charts/xos-core/templates/chameleon-deployment.yaml b/helm-charts/xos-core/templates/chameleon-deployment.yaml new file mode 100644 index 0000000..a715a98 --- /dev/null +++ b/helm-charts/xos-core/templates/chameleon-deployment.yaml @@ -0,0 +1,37 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: xos-chameleon + labels: + {{- include "xos-core.release_labels" . | indent 4 }} +spec: + replicas: 1 + template: + metadata: + labels: + app: xos-chameleon + spec: + containers: + - name: xos-chameleon + image: {{ .Values.global.registry }}{{ .Values.images.xos_chameleon.repository }}:{{ tpl .Values.images.xos_chameleon.tag . }} + imagePullPolicy: {{ .Values.images.xos_chameleon.pullPolicy }} + command: ["python", "chameleon/chameleon/main.py", "-R", "9101", "-G", "xos-core:50055", "--swagger-url", "/apidocs", "-r"] + ports: + - containerPort: 9101 + port: 9101 + protocol: TCP diff --git a/helm-charts/xos-core/templates/chameleon-service.yaml b/helm-charts/xos-core/templates/chameleon-service.yaml new file mode 100644 index 0000000..97e78c4 --- /dev/null +++ b/helm-charts/xos-core/templates/chameleon-service.yaml @@ -0,0 +1,30 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Service +metadata: + name: "xos-chameleon" + labels: + {{- include "xos-core.release_labels" . | indent 4 }} +spec: + type: NodePort + ports: + - port: 9101 + targetPort: 9101 + nodePort: {{ .Values.xos_chameleonNodePort }} + protocol: TCP + selector: + app: "xos-chameleon" diff --git a/helm-charts/xos-core/templates/core-configmap.yaml b/helm-charts/xos-core/templates/core-configmap.yaml new file mode 100644 index 0000000..b9d1e7d --- /dev/null +++ b/helm-charts/xos-core/templates/core-configmap.yaml @@ -0,0 +1,51 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: xos-core + labels: + {{- include "xos-core.release_labels" . | indent 4 }} +data: + config: | +{{ include "xos-core.config" . | indent 4 }} + +... +--- + +apiVersion: v1 +kind: ConfigMap +metadata: + name: xos-initial-data + labels: + {{- include "xos-core.release_labels" . | indent 4 }} +data: + config: | +{{ include "xos-core.initial_data" . | indent 4 }} + +... +--- + +apiVersion: v1 +kind: ConfigMap +metadata: + name: ca-certificates + labels: + {{- include "xos-core.release_labels" . | indent 4 }} +data: + chain: | +{{ include "xos-core.ca_cert_chain" . | indent 4 }} + diff --git a/helm-charts/xos-core/templates/core-deployment.yaml b/helm-charts/xos-core/templates/core-deployment.yaml new file mode 100644 index 0000000..a8625e2 --- /dev/null +++ b/helm-charts/xos-core/templates/core-deployment.yaml @@ -0,0 +1,82 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: xos-core + labels: + {{- include "xos-core.release_labels" . | indent 4 }} +spec: + replicas: 1 + template: + metadata: + labels: + app: xos-core + spec: + containers: + - name: xos-core + image: {{ .Values.global.registry }}{{ .Values.images.xos_core.repository }}:{{ tpl .Values.images.xos_core.tag . }} + imagePullPolicy: {{ .Values.images.xos_core.pullPolicy }} + command: ["/bin/bash", "-c", "cd coreapi; ./start_coreapi.sh"] + # command: ["/bin/bash", "-c", "sleep 86400"] + ports: + - containerPort: 50051 + port: 50051 + protocol: TCP + - containerPort: 50055 + port: 50055 + protocol: TCP + volumeMounts: + - name: coreapi-volume + mountPath: /opt/cord_profile + readOnly: true + - name: certchain-volume + mountPath: /usr/local/share/ca-certificates/local_certs.crt + subPath: config/ca_cert_chain.pem + - name: xos-core-config + mountPath: /opt/xos/xos_config.yaml + subPath: config/xos_config.yaml + - name: initial-data-config + mountPath: /opt/xos/core/migrations/initial_data.yaml + subPath: migrations/initial_data.yaml + volumes: + - name: coreapi-volume + secret: + secretName: coreapi-cert-secret + items: + - key: tls.crt + path: core_api_cert.pem + - key: tls.key + path: core_api_key.pem + - name: certchain-volume + configMap: + name: ca-certificates + items: + - key: chain + path: config/ca_cert_chain.pem + - name: xos-core-config + configMap: + name: xos-core + items: + - key: config + path: config/xos_config.yaml + - name: initial-data-config + configMap: + name: xos-initial-data + items: + - key: config + path: migrations/initial_data.yaml + diff --git a/helm-charts/xos-core/templates/core-grpc-service.yaml b/helm-charts/xos-core/templates/core-grpc-service.yaml new file mode 100644 index 0000000..3d7e8dc --- /dev/null +++ b/helm-charts/xos-core/templates/core-grpc-service.yaml @@ -0,0 +1,37 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Service +metadata: + name: "xos-core" + labels: + {{- include "xos-core.release_labels" . | indent 4 }} +spec: + type: NodePort + selector: + app: "xos-core" + ports: + - port: 50051 + targetPort: 50051 + name: secure + nodePort: {{ .Values.xos_core_gRPCSecureNodePort }} + protocol: TCP + - port: 50055 + targetPort: 50055 + name: insecure + nodePort: {{ .Values.xos_core_gRPCInsecureNodePort }} + protocol: TCP + diff --git a/helm-charts/xos-core/templates/core-prometheus-service.yaml b/helm-charts/xos-core/templates/core-prometheus-service.yaml new file mode 100644 index 0000000..5d3e57f --- /dev/null +++ b/helm-charts/xos-core/templates/core-prometheus-service.yaml @@ -0,0 +1,31 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Service +metadata: + name: "xos-core-prometheus" + labels: + {{- include "xos-core.release_labels" . | indent 4 }} +spec: + type: NodePort + selector: + app: "xos-core" + ports: + - port: 8000 + targetPort: 8000 + name: prometheus + nodePort: {{ .Values.xos_prometheusNodePort }} + protocol: TCP diff --git a/helm-charts/xos-core/templates/core-secrets.yaml b/helm-charts/xos-core/templates/core-secrets.yaml new file mode 100644 index 0000000..9d5a7c5 --- /dev/null +++ b/helm-charts/xos-core/templates/core-secrets.yaml @@ -0,0 +1,24 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Secret +metadata: + name: xos-admin-passwd-secret + namespace: default +type: Opaque +data: + password: {{ .Values.xosAdminPassword | b64enc }} + diff --git a/helm-charts/xos-core/templates/coreapi-cert-secret.yaml b/helm-charts/xos-core/templates/coreapi-cert-secret.yaml new file mode 100644 index 0000000..b70cba6 --- /dev/null +++ b/helm-charts/xos-core/templates/coreapi-cert-secret.yaml @@ -0,0 +1,24 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Secret +metadata: + name: coreapi-cert-secret + namespace: default +type: kubernetes.io/tls +data: + tls.crt: {{ .Files.Get "pki/xos-core.pem" | b64enc }} + tls.key: {{ .Files.Get "pki/xos-core.key" | b64enc }} diff --git a/helm-charts/xos-core/templates/tests/test-xos-core-api.yaml b/helm-charts/xos-core/templates/tests/test-xos-core-api.yaml new file mode 100644 index 0000000..1162de0 --- /dev/null +++ b/helm-charts/xos-core/templates/tests/test-xos-core-api.yaml @@ -0,0 +1,52 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Pod +metadata: + name: "{{ .Release.Name }}-api-test" + labels: + {{- include "xos-core.release_labels" . | indent 4 }} + annotations: + "helm.sh/hook": test-success +spec: + restartPolicy: Never + containers: + - name: {{ .Release.Name }}-api-test + image: {{ .Values.global.registry }}{{ .Values.images.xos_api_tester.repository }}:{{ tpl .Values.images.xos_api_tester.tag . }} + imagePullPolicy: {{ .Values.images.xos_api_tester.pullPolicy }} + volumeMounts: + - name: log-volume + mountPath: /src/cord-api/Tests/Log/ + env: + - name: SERVER_IP + value: 'xos-chameleon' + - name: SERVER_PORT + value: '9101' + - name: SITE_NAME + value: {{ .Values.cordSiteName | quote }} + - name: XOS_USER + value: {{ .Values.xosAdminUser | quote }} + - name: XOS_PASSWD + valueFrom: + secretKeyRef: + name: xos-admin-passwd-secret + key: password + command: ["pybot", "-L", "TRACE", "-d", "Log", "-T", "Ch_DeploymentTest.txt", "Ch_SiteTest.txt", "Ch_UsersTest.txt", "Ch_SliceTest.txt", "Ch_ServiceTest.txt"] + volumes: + - name: log-volume + hostPath: + path: /tmp/helm_test_xos_core_logs_{{ dateInZone "20060102T030405.00Z" (now) "UTC" }} + type: DirectoryOrCreate diff --git a/helm-charts/xos-core/templates/tosca-configmap.yaml b/helm-charts/xos-core/templates/tosca-configmap.yaml new file mode 100644 index 0000000..6269be3 --- /dev/null +++ b/helm-charts/xos-core/templates/tosca-configmap.yaml @@ -0,0 +1,24 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: xos-tosca + labels: + {{- include "xos-core.release_labels" . | indent 4 }} +data: + config: | +{{ include "xos-tosca.config" . | indent 4 }} diff --git a/helm-charts/xos-core/templates/tosca-deployment.yaml b/helm-charts/xos-core/templates/tosca-deployment.yaml new file mode 100644 index 0000000..c6f8376 --- /dev/null +++ b/helm-charts/xos-core/templates/tosca-deployment.yaml @@ -0,0 +1,56 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: xos-tosca + labels: + {{- include "xos-core.release_labels" . | indent 4 }} +spec: + replicas: 1 + template: + metadata: + labels: + app: xos-tosca + spec: + containers: + - name: xos-tosca + image: {{ .Values.global.registry }}{{ .Values.images.xos_tosca.repository }}:{{ tpl .Values.images.xos_tosca.tag . }} + imagePullPolicy: {{ .Values.images.xos_tosca.pullPolicy }} + ports: + - containerPort: 9102 + port: 9102 + protocol: TCP + volumeMounts: + - name: certchain-volume + mountPath: /usr/local/share/ca-certificates/local_certs.crt + subPath: config/ca_cert_chain.pem + - name: xos-tosca-config + mountPath: /opt/xos-tosca/src/xos-tosca.config.yaml + subPath: config/xos-tosca.config.yaml + volumes: + - name: certchain-volume + configMap: + name: ca-certificates + items: + - key: chain + path: config/ca_cert_chain.pem + - name: xos-tosca-config + configMap: + name: xos-tosca + items: + - key: config + path: config/xos-tosca.config.yaml diff --git a/helm-charts/xos-core/templates/tosca-service.yaml b/helm-charts/xos-core/templates/tosca-service.yaml new file mode 100644 index 0000000..4c70119 --- /dev/null +++ b/helm-charts/xos-core/templates/tosca-service.yaml @@ -0,0 +1,30 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Service +metadata: + name: "xos-tosca" + labels: + {{- include "xos-core.release_labels" . | indent 4 }} +spec: + type: NodePort + ports: + - port: 9102 + targetPort: 9102 + nodePort: {{ .Values.xos_toscaNodePort }} + protocol: TCP + selector: + app: "xos-tosca" diff --git a/helm-charts/xos-core/values.yaml b/helm-charts/xos-core/values.yaml new file mode 100644 index 0000000..3bd9df5 --- /dev/null +++ b/helm-charts/xos-core/values.yaml @@ -0,0 +1,82 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +# Docker images +# YAML variable names can't contain `-`, so substituted with `_` +images: + xos_core: + repository: 'xosproject/xos-core' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + + xos_chameleon: + repository: 'xosproject/chameleon' + tag: '3.3.0' + pullPolicy: 'Always' + + xos_tosca: + repository: 'xosproject/xos-tosca' + tag: '1.3.0' + pullPolicy: 'Always' + + xos_api_tester: + repository: 'xosproject/xos-api-tester' + tag: 'master' + pullPolicy: 'Always' + +global: + registry: "" + +loglevel: "DEBUG" + +# NodePorts +xos_chameleonNodePort: 30006 +xos_toscaNodePort: 30007 +xos_prometheusNodePort: 30009 +xos_core_gRPCSecureNodePort: 30010 +xos_core_gRPCInsecureNodePort: 30011 + +# kafka +platformKafka: cord-kafka:9092 + +# XOS Admin username/password +xosAdminUser: 'admin@opencord.org' +xosAdminPassword: 'letmein' +xosAdminFirstname: 'XOS' +xosAdminLastname: 'Admin' + +# CORD site names +cordSiteName: mysite + +# Database name/username/password for XOS and the xos-db subchart +xosDBName: 'xos' +xosDBUser: 'postgres' +xosDBPassword: 'password' + +xos-db: + xosDBName: 'xos' + xosDBUser: 'postgres' + xosDBPassword: 'password' + +# Certificates can be regenerated with scripts/pki/Makefile +# Created on: Fri Dec 14 16:46:00 UTC 2018, good for 366 days +ca_cert_chain: | + LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQxakNDQXI2Z0F3SUJBZ0lKQUpsNGd5bGtZUi9zTUEwR0NTcUdTSWIzRFFFQkN3VUFNSGd4Q3pBSkJnTlYKQkFZVEFsVlRNUk13RVFZRFZRUUlEQXBEWVd4cFptOXlibWxoTVJNd0VRWURWUVFIREFwTlpXNXNieUJRWVhKcgpNUXd3Q2dZRFZRUUtEQU5QVGtZeEZUQVRCZ05WQkFzTURGUmxjM1JwYm1jZ1QyNXNlVEVhTUJnR0ExVUVBd3dSClEwOVNSQ0JVWlhOMElGSnZiM1FnUTBFd0hoY05NVGd4TWpFME1UWTBOakF3V2hjTk1Ua3hNakUxTVRZME5qQXcKV2pCNE1Rc3dDUVlEVlFRR0V3SlZVekVUTUJFR0ExVUVDQXdLUTJGc2FXWnZjbTVwWVRFVE1CRUdBMVVFQnd3SwpUV1Z1Ykc4Z1VHRnlhekVNTUFvR0ExVUVDZ3dEVDA1R01SVXdFd1lEVlFRTERBeFVaWE4wYVc1bklFOXViSGt4CkdqQVlCZ05WQkFNTUVVTlBVa1FnVkdWemRDQlNiMjkwSUVOQk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0MKQVE4QU1JSUJDZ0tDQVFFQXlmdXJic3lHNC9NL1o1Y0x1a1drNU84ZjVTemxQY21md20rek11NTFtRlloU05hTgpiRkFic0FReFZqallvbTB1TEUxdjZsTlZuWGkxVzQySG9tM0c3ZFgyb1NEZ0loUXloS29jRkh0WlNGS0o0RWF1CmJsUXhXUzFaQ1VZSFpINUdMVmMxWUNMUHhUbFdndnlGSnVZUk9LZElaWXloT1ZORHY2RHlIN1cwQmsva1M5MEEKamhkZ3h3U0dJcldsS2FveGhjSG01R0ErenZiRnBOYUx1T201aFNDWHlpRnVSdHd1bXV5YlJMalNyUC9jUjF3OAorZjMvejkvQlZXTEdZMVBTN1RvSENUTk5veHNXUVNHQ1piVUlzUVpiSXhDSXNPVUJkbGxDWkRmYnErSUROaXErCnI3dTByVC9Tamh5WVdCcmkrcFNzc0lGdWNwcmhvOHJnZVJyMVpRSURBUUFCbzJNd1lUQWRCZ05WSFE0RUZnUVUKRlNrQmxkdXF5R0hibGhJMUdHV0NEV1NPNXRvd0h3WURWUjBqQkJnd0ZvQVVGU2tCbGR1cXlHSGJsaEkxR0dXQwpEV1NPNXRvd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBWVl3RFFZSktvWklodmNOCkFRRUxCUUFEZ2dFQkFEazNCbVNmbUFpQ3dCZENRRHNodTViZWpQWStnckxNanROdkcxSXNqMUtRZHlpMmF6SGQKYUN0TW5LODdDbmJubDNlNzErcEx4aFJablcwQkFFeUxMNG9NOFYvR1kvcG9SSG45cWV1bGJtRTNqWkF2bTE0VAp5YUJhQXpzYTNDOTBUZkZEZG1WU1lPTWFocEM3Q2IvN01TZldkWFBXL3lLdkpZYzZCdUVvcVNUNE5ZeVBSVmNuCmdwUXp3dU9CMEN6dGMySHU2MDRFNTRRT05GOVl2aW5WYU9zVmFvQTJRQzJTemZtSlUzTWtnWm5HMTAvd0hlZEYKWk4wbUthSk1mMHpwWHI2MU5pOTVZc2pONmJnaVY1aExwZDBYUXBVTXpXVzRFZ0xEbjZyeFNjejcwRWh6SW1aRwpVbG40T20ybnMxSXR4NDE3RGtXbUp1cGRIY1U1d0w4MkZ4Yz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= +secrets: + core_api_cert: | + Q2VydGlmaWNhdGU6CiAgICBEYXRhOgogICAgICAgIFZlcnNpb246IDMgKDB4MikKICAgICAgICBTZXJpYWwgTnVtYmVyOiA0MDk2ICgweDEwMDApCiAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGEyNTZXaXRoUlNBRW5jcnlwdGlvbgogICAgICAgIElzc3VlcjogQz1VUywgU1Q9Q2FsaWZvcm5pYSwgTD1NZW5sbyBQYXJrLCBPPU9ORiwgT1U9VGVzdGluZyBPbmx5LCBDTj1DT1JEIFRlc3QgUm9vdCBDQQogICAgICAgIFZhbGlkaXR5CiAgICAgICAgICAgIE5vdCBCZWZvcmU6IERlYyAxNCAxNjo0NjowMCAyMDE4IEdNVAogICAgICAgICAgICBOb3QgQWZ0ZXIgOiBEZWMgMTUgMTY6NDY6MDAgMjAxOSBHTVQKICAgICAgICBTdWJqZWN0OiBDPVVTLCBTVD1DYWxpZm9ybmlhLCBMPU1lbmxvIFBhcmssIE89T05GLCBPVT1UZXN0aW5nIE9ubHksIENOPXhvcy1jb3JlCiAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CiAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCiAgICAgICAgICAgICAgICBQdWJsaWMtS2V5OiAoMjA0OCBiaXQpCiAgICAgICAgICAgICAgICBNb2R1bHVzOgogICAgICAgICAgICAgICAgICAgIDAwOmFmOjFiOmRlOjZmOmQ2OjE0OjMyOmQwOjI2OjEzOmM2OjhlOmQ0OjRhOgogICAgICAgICAgICAgICAgICAgIDMzOmNjOjdjOmJhOmVkOmE0Ojg0OjNhOjRiOmJjOmZkOmNiOjFkOjkxOjQzOgogICAgICAgICAgICAgICAgICAgIGUzOmFjOmZiOjBmOjVjOjM5OmI5OjhlOmEzOjU1OjgxOjhhOjUzOjJhOjUxOgogICAgICAgICAgICAgICAgICAgIDE2OjQ2OjIzOmMwOjFmOjIwOmE3OjkxOjY1OmY1OjZjOjM2OmM1OjY0OjhmOgogICAgICAgICAgICAgICAgICAgIGRlOjE0OjMwOjg1OjMzOmM3OjY1OjliOjZkOmE1Ojg2OjU2OjdjOjk0OmZhOgogICAgICAgICAgICAgICAgICAgIGNkOjNkOjIxOjBmOjYwOjBlOjRhOjhjOjdkOmNkOjhkOjQ4OmI0OmRmOjM2OgogICAgICAgICAgICAgICAgICAgIGIyOjgyOjE4Ojg0OjNmOjU3OjQxOmY3OjM0OjA2OjI1OmQwOmI2OjUzOjVhOgogICAgICAgICAgICAgICAgICAgIDgwOmMwOjJhOmZkOmVhOmYyOmM2OmJhOmRmOjc3OjdhOjlhOjIzOjEwOmU3OgogICAgICAgICAgICAgICAgICAgIDlkOjRjOmQ5OmM3OjIxOjBkOjhjOjk4OmJhOmI5OmIyOjQzOmI2OmEwOjRjOgogICAgICAgICAgICAgICAgICAgIDQyOjYyOmZiOjNlOmZkOmY4OjcxOmY4OmUxOjY5OjFhOjk1OjY2OmVkOjQxOgogICAgICAgICAgICAgICAgICAgIGIyOjYyOmVmOjJmOmFkOjA2OjJkOmIwOjQ4OmM2OmJkOmViOmQ2OjlmOmZlOgogICAgICAgICAgICAgICAgICAgIGFjOjEyOmUyOjU4OmQzOmFhOmQyOjdkOjU0OmRlOjc1OjkyOmVhOjllOjFhOgogICAgICAgICAgICAgICAgICAgIDk3OjdiOjAzOjY4OjJjOjEyOjA1OmI1OmQ5OmE1OjMwOmRkOjhhOjk5OmI0OgogICAgICAgICAgICAgICAgICAgIDhkOmE3OjcyOjEwOmYzOmQ5OjljOjg2OmRkOjA5OmI2OmQwOjgyOjQyOjMwOgogICAgICAgICAgICAgICAgICAgIDZkOmNiOmQzOjZhOmI5OjMzOmM2OjM5OmFiOmNhOjhmOmJhOjM0OjJiOmZiOgogICAgICAgICAgICAgICAgICAgIDM2OjQ2Ojc0OmVlOjMwOmVlOjhhOmE4OjJlOjJjOjVmOmM4OjhlOmM5OjkzOgogICAgICAgICAgICAgICAgICAgIGIyOjMwOjJlOmIwOjI2OjQ3Ojg4OjBjOmE5OjE0OjBjOjc4OjAyOjY3OjBjOgogICAgICAgICAgICAgICAgICAgIGFkOmFiCiAgICAgICAgICAgICAgICBFeHBvbmVudDogNjU1MzcgKDB4MTAwMDEpCiAgICAgICAgWDUwOXYzIGV4dGVuc2lvbnM6CiAgICAgICAgICAgIFg1MDl2MyBTdWJqZWN0IEtleSBJZGVudGlmaWVyOiAKICAgICAgICAgICAgICAgIDkyOjZEOkMwOkU5OjNFOjk5OkNEOkE1OkE0OkM5Ojk1OkIwOkE0OjE1OjE4OkI3OkNBOjFGOkIxOjg3CiAgICAgICAgICAgIFg1MDl2MyBBdXRob3JpdHkgS2V5IElkZW50aWZpZXI6IAogICAgICAgICAgICAgICAga2V5aWQ6MTU6Mjk6MDE6OTU6REI6QUE6Qzg6NjE6REI6OTY6MTI6MzU6MTg6NjU6ODI6MEQ6NjQ6OEU6RTY6REEKICAgICAgICAgICAgICAgIERpck5hbWU6L0M9VVMvU1Q9Q2FsaWZvcm5pYS9MPU1lbmxvIFBhcmsvTz1PTkYvT1U9VGVzdGluZyBPbmx5L0NOPUNPUkQgVGVzdCBSb290IENBCiAgICAgICAgICAgICAgICBzZXJpYWw6OTk6Nzg6ODM6Mjk6NjQ6NjE6MUY6RUMKCiAgICAgICAgICAgIFg1MDl2MyBCYXNpYyBDb25zdHJhaW50czogCiAgICAgICAgICAgICAgICBDQTpGQUxTRQogICAgICAgICAgICBYNTA5djMgS2V5IFVzYWdlOiBjcml0aWNhbAogICAgICAgICAgICAgICAgRGlnaXRhbCBTaWduYXR1cmUsIEtleSBFbmNpcGhlcm1lbnQKICAgICAgICAgICAgWDUwOXYzIEV4dGVuZGVkIEtleSBVc2FnZTogCiAgICAgICAgICAgICAgICBUTFMgV2ViIFNlcnZlciBBdXRoZW50aWNhdGlvbgogICAgICAgICAgICBYNTA5djMgU3ViamVjdCBBbHRlcm5hdGl2ZSBOYW1lOiAKICAgICAgICAgICAgICAgIEROUzp4b3MtY29yZSwgRE5TOnhvcy1jb3JlLmRlZmF1bHQsIEROUzp4b3MtY29yZS5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsCiAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGEyNTZXaXRoUlNBRW5jcnlwdGlvbgogICAgICAgICBhNTo0MzpmNToyMzozNjpjNDo5MjozMDpiZjowMToxZTphYjo2MTphZDpmZTpiNDo2Yjo5ZjoKICAgICAgICAgODg6YmI6Y2Y6YWU6ZTE6OGE6NTI6MDQ6ODI6NzI6MWM6M2M6ZWI6Mjk6YTU6NTY6NzA6YzI6CiAgICAgICAgIDk3OjEzOjY5OjM1OjVlOmZiOjRlOmMyOmUzOmI2OjQ1OmJhOjEwOjdiOmUxOjRjOmU2OjkwOgogICAgICAgICA1ZTo0MjoyODo3YjpjNDowMzoxNTo3Mjo1MDowMTo3Yjo3NzpjYzo1NDo1Zjo0Yzo4NDpmZjoKICAgICAgICAgY2M6NjM6YzA6ODM6YTc6YTc6YmU6YmU6YTI6N2U6YjE6ZmU6ZmI6OWY6YWY6ZjU6NDQ6YmE6CiAgICAgICAgIDBjOjczOmJlOjYyOmFlOmFiOmZiOmFmOjJjOjAyOmRjOjFmOjc5OjMzOmFlOmMzOjUzOmE0OgogICAgICAgICBkNDo3YTplYzplMzozYjowMTo3Mjo5YTo1ZTo4NzowZjpiNDo2Yjo0Mjo0ODo4ZjpiYTozZjoKICAgICAgICAgZDc6Nzk6YzE6OTk6MTA6NTM6MmY6ODU6MzY6OTY6NmI6NWI6MWY6ZTg6OTE6NTQ6ZDA6ZWM6CiAgICAgICAgIDdmOjk0OmM3Ojg4OjVlOmZmOjBiOjYzOjIzOmJkOmY2OjA3OjhlOmY4OmQ5OjhkOmUxOmIyOgogICAgICAgICBiNzowYzoxNzpkNDo0ZTpmNDpmZjo3ZDpiZDpiMTowNToxODo0MDplZDo2NTpmMTpkZTpmYzoKICAgICAgICAgNzU6OWU6Mjk6YWQ6YTk6NzE6ZWY6NjQ6NTI6Yzg6NWM6ODE6MmQ6NDM6M2Q6Mzk6Yzg6OTI6CiAgICAgICAgIGZlOjMwOmJlOmM1OjIxOmY5OmJlOmNhOmQ0OmFhOjI2Ojk5OmEwOjdjOmNhOmVjOjQzOmI1OgogICAgICAgICAyYjo0YzphMTowMjpjMzo4NzpiYzozNTphYzpkODpiZjplMzo5MDo4Mjo0Mzo5NDphZTplZDoKICAgICAgICAgM2I6MDM6ZWI6NjY6ODk6ZGI6ZDM6MTk6ZTA6NmE6YjA6Njc6MTQ6Zjk6NDQ6NjQ6ODk6MTQ6CiAgICAgICAgIGI1OmZjOmVkOjY0Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFc0RDQ0E1aWdBd0lCQWdJQ0VBQXdEUVlKS29aSWh2Y05BUUVMQlFBd2VERUxNQWtHQTFVRUJoTUNWVk14CkV6QVJCZ05WQkFnTUNrTmhiR2xtYjNKdWFXRXhFekFSQmdOVkJBY01DazFsYm14dklGQmhjbXN4RERBS0JnTlYKQkFvTUEwOU9SakVWTUJNR0ExVUVDd3dNVkdWemRHbHVaeUJQYm14NU1Sb3dHQVlEVlFRRERCRkRUMUpFSUZSbApjM1FnVW05dmRDQkRRVEFlRncweE9ERXlNVFF4TmpRMk1EQmFGdzB4T1RFeU1UVXhOalEyTURCYU1HOHhDekFKCkJnTlZCQVlUQWxWVE1STXdFUVlEVlFRSURBcERZV3hwWm05eWJtbGhNUk13RVFZRFZRUUhEQXBOWlc1c2J5QlEKWVhKck1Rd3dDZ1lEVlFRS0RBTlBUa1l4RlRBVEJnTlZCQXNNREZSbGMzUnBibWNnVDI1c2VURVJNQThHQTFVRQpBd3dJZUc5ekxXTnZjbVV3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3ZHOTV2CjFoUXkwQ1lUeG83VVNqUE1mTHJ0cElRNlM3ejl5eDJSUStPcyt3OWNPYm1PbzFXQmlsTXFVUlpHSThBZklLZVIKWmZWc05zVmtqOTRVTUlVengyV2JiYVdHVm55VStzMDlJUTlnRGtxTWZjMk5TTFRmTnJLQ0dJUS9WMEgzTkFZbAowTFpUV29EQUt2M3E4c2E2MzNkNm1pTVE1NTFNMmNjaERZeVl1cm15UTdhZ1RFSmkrejc5K0hINDRXa2FsV2J0ClFiSmk3eSt0Qmkyd1NNYTk2OWFmL3F3UzRsalRxdEo5Vk41MWt1cWVHcGQ3QTJnc0VnVzEyYVV3M1lxWnRJMm4KY2hEejJaeUczUW0yMElKQ01HM0wwMnE1TThZNXE4cVB1alFyK3paR2RPNHc3b3FvTGl4ZnlJN0prN0l3THJBbQpSNGdNcVJRTWVBSm5ESzJyQWdNQkFBR2pnZ0ZMTUlJQlJ6QWRCZ05WSFE0RUZnUVVrbTNBNlQ2WnphV2t5Wld3CnBCVVl0OG9mc1ljd2dhb0dBMVVkSXdTQm9qQ0JuNEFVRlNrQmxkdXF5R0hibGhJMUdHV0NEV1NPNXRxaGZLUjYKTUhneEN6QUpCZ05WQkFZVEFsVlRNUk13RVFZRFZRUUlEQXBEWVd4cFptOXlibWxoTVJNd0VRWURWUVFIREFwTgpaVzVzYnlCUVlYSnJNUXd3Q2dZRFZRUUtEQU5QVGtZeEZUQVRCZ05WQkFzTURGUmxjM1JwYm1jZ1QyNXNlVEVhCk1CZ0dBMVVFQXd3UlEwOVNSQ0JVWlhOMElGSnZiM1FnUTBHQ0NRQ1plSU1wWkdFZjdEQUpCZ05WSFJNRUFqQUEKTUE0R0ExVWREd0VCL3dRRUF3SUZvREFUQmdOVkhTVUVEREFLQmdnckJnRUZCUWNEQVRCSkJnTlZIUkVFUWpCQQpnZ2g0YjNNdFkyOXlaWUlRZUc5ekxXTnZjbVV1WkdWbVlYVnNkSUlpZUc5ekxXTnZjbVV1WkdWbVlYVnNkQzV6CmRtTXVZMngxYzNSbGNpNXNiMk5oYkRBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQXBVUDFJemJFa2pDL0FSNnIKWWEzK3RHdWZpTHZQcnVHS1VnU0NjaHc4NnltbFZuRENseE5wTlY3N1RzTGp0a1c2RUh2aFRPYVFYa0lvZThRRApGWEpRQVh0M3pGUmZUSVQvekdQQWc2ZW52cjZpZnJIKys1K3Y5VVM2REhPK1lxNnIrNjhzQXR3ZmVUT3V3MU9rCjFIcnM0enNCY3BwZWh3KzBhMEpJajdvLzEzbkJtUkJUTDRVMmxtdGJIK2lSVk5Ec2Y1VEhpRjcvQzJNanZmWUgKanZqWmplR3l0d3dYMUU3MC8zMjlzUVVZUU8xbDhkNzhkWjRwcmFseDcyUlN5RnlCTFVNOU9jaVMvakMreFNINQp2c3JVcWlhWm9Ieks3RU8xSzB5aEFzT0h2RFdzMkwvamtJSkRsSzd0T3dQclpvbmIweG5nYXJCbkZQbEVaSWtVCnRmenRaQT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K + core_api_key: | + LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcGdJQkFBS0NBUUVBcnh2ZWI5WVVNdEFtRThhTzFFb3p6SHk2N2FTRU9rdTgvY3Nka1VQanJQc1BYRG01CmpxTlZnWXBUS2xFV1JpUEFIeUNua1dYMWJEYkZaSS9lRkRDRk04ZGxtMjJsaGxaOGxQck5QU0VQWUE1S2pIM04KalVpMDN6YXlnaGlFUDFkQjl6UUdKZEMyVTFxQXdDcjk2dkxHdXQ5M2Vwb2pFT2VkVE5uSElRMk1tTHE1c2tPMgpvRXhDWXZzKy9maHgrT0ZwR3BWbTdVR3lZdTh2clFZdHNFakd2ZXZXbi82c0V1SlkwNnJTZlZUZWRaTHFuaHFYCmV3Tm9MQklGdGRtbE1OMkttYlNOcDNJUTg5bWNodDBKdHRDQ1FqQnR5OU5xdVRQR09hdktqN28wSy9zMlJuVHUKTU82S3FDNHNYOGlPeVpPeU1DNndKa2VJREtrVURIZ0Nad3l0cXdJREFRQUJBb0lCQVFDaHhmdHdFclZDWkc1cApJcTFkanRmZitQT3hES1prUFFoeTU2MS9RTnNjT2kxc3BKKzdHVWFya0tGWW5PVVpFM293eDdoSGFZeWMxdFR5CkhMK3NvMDdNRVZEYmtTYTB2ejRGWE5jenZGRTZDcm53cFdDN1FBcHBsVnpCTitrbG8zVjc3Z0luK1hRWCthcXMKM29zSy9oTi9IV2lDU2RoUGk4c1U3clU2NGd1Y0pJNkhnK2lnMlFYWTk0bWFjVHJhVkhOMWtSd0RjYnFLbDhsVwpoUTlSTjNROXpQdFF3OUxGd0xHNGN1VkNtZ09XOW9LeE9weTVjM2hoNGhPL0ZVMEQzOU00eVhmcFJBQ1hzYzhmCmNXMjRaSC9pQzZ2bXVjNEtGejlsaWVmT1hnMy9LVWtJTzgzNkJxNGk1K3Jjc0Y2QS9ucllPV2VKYmZnL2dpR1UKWGV6OXdOcEJBb0dCQU5rNDUxeTV2NVJsYmtmN2VJNzA4NXBtM3JJeTZodkFXUktBRTZ5UWJra0dqa2pkSWZndgp5QjhtdXd4NXpDeXo1Mzl2WjhYVUhIeC9KbkR3UkRlc0NRMlZKSG5Qd1NocFE3ZmNXVDJrWEFkQTdDUDlFcUpwCkpDekZiaFZPTHVlakRGMTdFVGJvU0JOdU9mc0dNWmV1WFhCMzZ6VFJURFh4bzdrR2lkekpFeFM3QW9HQkFNNWUKWCtUUGNydUhkYnVZWnZ4WUZORk9kb3B0UHhUMnJ3YlpkS3lVb2dFM1ZLY2w5MUVlVHMwRHdYTmZLWE1JQ3cybgo3SFUwNEJqVjFJd3FzVFRqMVh0SUhBVHA5elQwV1FkNXgwUUVwUkhXenlSdHduWkpTbGJ3K2NGZFNrU1NnamNpCnlvY1puUE9jNzRKSWphaC9uRUlkUDZicnkzNG9NK3VWTjU1aVRyUFJBb0dCQU5oakZDN05wcWZvUnV5VCtHdkkKWGFjdzFLVUZqU3FwK05FeUh1Y25WWVdQYjB2c1pUdDhOY202WmxpdU9CTkwvODkxcGhWdkVCV0JBRVUvUTJXRwpEZHFtK0pnVHVtSk1RalkwM2YxRzdwb1hOV1ZBWkVDL3BsYW5NZHN0Y0JJMTNVcCtIdzdvWTJ4ZndJaHNpaGlFCmpQWk5yMU9GTDNzSlJNUTdYRGhCWWEyakFvR0JBSTgveTJqVTUxdHRLRGhVRGdqVVMzOE83QklpeTBzT0FXakwKd2NXYVZ1cHBNZ1hrd013Nk1aRDJMbTZiZS9ZeGV4cTdtZE95Skd5WTRiVjZYUS9OcHY2d2kyS04xZCtZVGNSMgpyKzl6R2ZKTUhmVzNpdWo0N3ZWeXlLdUV5bXpYRmpTWG5lWXh6VlQ5ZHZRRTBQQkp4SG5RTzhMdW9vNnI4WDV5ClVlMUxhRDVCQW9HQkFLVjJkYWJvWTBpeUtyOXFDV0NXZ3pjOFpuc0FEdHoyYzZ2Z2lUTXpUeDNNamdPb1d5TXMKWnRUUy94OW1Sei9CZUJnNWhNRCszS0ZoUzNsd1RUZ2xWYUI2NjFQUWZ6Tm1sZXJoQUtXV3pFV3lkelVISzM3dQpUS0hjb01PMUdmWU9mUjVFMWZKNWNWNGlFSTVPVU9rTGtMR0RjZ2lFcUJjck9kRThkeGYxY3NlLwotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo= + diff --git a/helm-charts/xos-db/Chart.yaml b/helm-charts/xos-db/Chart.yaml new file mode 100644 index 0000000..9553ed9 --- /dev/null +++ b/helm-charts/xos-db/Chart.yaml @@ -0,0 +1,22 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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: xos-db +version: 1.0.1 + +icon: https://www.postgresql.org/media/img/about/press/elephant.png + +# Postgres container from: https://hub.docker.com/_/postgres/ +appVersion: '10.3-alpine' diff --git a/helm-charts/xos-db/templates/_helpers.tpl b/helm-charts/xos-db/templates/_helpers.tpl new file mode 100644 index 0000000..1244611 --- /dev/null +++ b/helm-charts/xos-db/templates/_helpers.tpl @@ -0,0 +1,33 @@ +{{- /* +Copyright 2017-present Open Networking Foundation + +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. +*/ -}} + +{{- define "xos-db.release_labels" }} +app: {{ printf "%s-%s" .Release.Name .Chart.Name | trunc 63 }} +chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }} +release: {{ .Release.Name }} +heritage: {{ .Release.Service }} +version: {{ .Chart.Version }} +{{- end }} + +{{- define "xos-db.postgresql-conf" }} + +listen_addresses = '*' + +# as per https://github.com/kubernetes/kubernetes/issues/71233 +huge_pages = off # on, off, or try + +{{- end }} + diff --git a/helm-charts/xos-db/templates/_persist.tpl b/helm-charts/xos-db/templates/_persist.tpl new file mode 100644 index 0000000..ee6fb9b --- /dev/null +++ b/helm-charts/xos-db/templates/_persist.tpl @@ -0,0 +1,30 @@ +{{- /* +Copyright 2017-present Open Networking Foundation + +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. +*/ -}} +{{- define "xos-db.persistent-volume-claim" }} +--- +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: {{ .Values.pvClaimName }} +spec: + accessModes: + - ReadWriteOnce + storageClassName: {{ .Values.storageClassName }} + resources: + requests: + storage: 1Gi +{{- end }} + diff --git a/helm-charts/xos-db/templates/db-configmap.yaml b/helm-charts/xos-db/templates/db-configmap.yaml new file mode 100644 index 0000000..af03cf5 --- /dev/null +++ b/helm-charts/xos-db/templates/db-configmap.yaml @@ -0,0 +1,24 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: xos-db + labels: + {{- include "xos-db.release_labels" . | indent 4 }} +data: + config: | +{{ include "xos-db.postgresql-conf" . | indent 4 }} diff --git a/helm-charts/xos-db/templates/db-deployment.yaml b/helm-charts/xos-db/templates/db-deployment.yaml new file mode 100644 index 0000000..4f0bee6 --- /dev/null +++ b/helm-charts/xos-db/templates/db-deployment.yaml @@ -0,0 +1,68 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: xos-db + labels: + app: xos-db +spec: + replicas: 1 + template: + metadata: + labels: + app: xos-db + spec: + containers: + - name: xos-db + image: {{ .Values.global.registry }}{{ .Values.image.repository }}:{{ tpl .Values.image.tag . }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + ports: + - containerPort: 5432 + protocol: TCP + env: + - name: POSTGRES_DB + value: {{ .Values.xosDBName | quote }} + - name: POSTGRES_USER + value: {{ .Values.xosDBUser | quote }} + - name: POSTGRES_PASSWORD + valueFrom: + secretKeyRef: + name: xos-db-secrets + key: password + - name: PGDATA + value: "/var/lib/postgresql/data/pgdata" + volumeMounts: + - name: xos-db-config + mountPath: /usr/local/share/postgresql/postgresql.conf.sample + subPath: config/postgresql.conf.sample +{{- if .Values.needDBPersistence }} + - name: db-pv-storage + mountPath: "/var/lib/postgresql/data" +{{- end }} + volumes: + - name: xos-db-config + configMap: + name: xos-db + items: + - key: config + path: config/postgresql.conf.sample +{{- if .Values.needDBPersistence }} + - name: db-pv-storage + persistentVolumeClaim: + claimName: {{ .Values.pvClaimName }} +{{- include "xos-db.persistent-volume-claim" . }} +{{- end }} diff --git a/helm-charts/xos-db/templates/db-secrets.yaml b/helm-charts/xos-db/templates/db-secrets.yaml new file mode 100644 index 0000000..9f41343 --- /dev/null +++ b/helm-charts/xos-db/templates/db-secrets.yaml @@ -0,0 +1,23 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Secret +metadata: + name: xos-db-secrets + namespace: default +type: Opaque +data: + password: {{ .Values.xosDBPassword | b64enc }} diff --git a/helm-charts/xos-db/templates/db-service.yaml b/helm-charts/xos-db/templates/db-service.yaml new file mode 100644 index 0000000..fe8f3b7 --- /dev/null +++ b/helm-charts/xos-db/templates/db-service.yaml @@ -0,0 +1,29 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Service +metadata: + name: "xos-db" + labels: + {{- include "xos-db.release_labels" . | indent 4 }} +spec: + type: ClusterIP + selector: + app: "xos-db" + ports: + - port: 5432 + targetPort: 5432 + protocol: TCP diff --git a/helm-charts/xos-db/values.yaml b/helm-charts/xos-db/values.yaml new file mode 100644 index 0000000..8428769 --- /dev/null +++ b/helm-charts/xos-db/values.yaml @@ -0,0 +1,34 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +# XOS Postgres database related values + +image: + repository: 'postgres' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + +global: + registry: "" + +# Database name/username/password +xosDBName: 'xos' +xosDBUser: 'postgres' +xosDBPassword: 'password' + +# DB persistence related vars +needDBPersistence: false +pvClaimName: xosdb-pv-claim +storageClassName: "" diff --git a/helm-charts/xos-gui/.helmignore b/helm-charts/xos-gui/.helmignore new file mode 100644 index 0000000..f0c1319 --- /dev/null +++ b/helm-charts/xos-gui/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/helm-charts/xos-gui/Chart.yaml b/helm-charts/xos-gui/Chart.yaml new file mode 100644 index 0000000..22afb38 --- /dev/null +++ b/helm-charts/xos-gui/Chart.yaml @@ -0,0 +1,22 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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: xos-gui +description: Web GUI for XOS +icon: https://guide.opencord.org/logos/xos.svg +version: 1.2.4 + +# appVersion is of the xos-gui container, xos-ws tag is specified in values.yaml +appVersion: 1.0.5 diff --git a/helm-charts/xos-gui/templates/_helpers.tpl b/helm-charts/xos-gui/templates/_helpers.tpl new file mode 100644 index 0000000..74a28cc --- /dev/null +++ b/helm-charts/xos-gui/templates/_helpers.tpl @@ -0,0 +1,62 @@ +{{- /* +Copyright 2017-present Open Networking Foundation + +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. +*/ -}} + +{{- define "xos-gui.release_labels" }} +app: {{ printf "%s-%s" .Release.Name .Chart.Name | trunc 63 }} +chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }} +release: {{ .Release.Name }} +heritage: {{ .Release.Service }} +version: {{ .Chart.Version }} +{{- end }} + +{{- define "xos-gui.app_config" }} +angular.module('app') +.constant('AppConfig', { + apiEndpoint: '/xosapi/v1', + websocketClient: '/' +}); +{{- end }} + +{{- define "xos-gui.style_config" }} +angular.module('app') +.constant('StyleConfig', { + projectName: {{ .Values.xos_projectName | quote }}, + favicon: 'cord-favicon.png', + background: 'cord-bg.jpg', + payoff: 'Your VNF orchestrator', + logo: 'cord-logo.png', + routes: [ + { + label: 'Slices', + state: 'xos.core.slice', + }, + { + label: 'Nodes', + state: 'xos.core.node', + }, + { + label: 'Instances', + state: 'xos.core.instance', + }, + ] +}); +{{- end }} + +{{- define "xos-gui.cord_version" }} +{ + "version": {{ .Values.cord_version | quote }} +} +{{- end }} diff --git a/helm-charts/xos-gui/templates/_ws.tpl b/helm-charts/xos-gui/templates/_ws.tpl new file mode 100644 index 0000000..0975fe0 --- /dev/null +++ b/helm-charts/xos-gui/templates/_ws.tpl @@ -0,0 +1,26 @@ +{{- /* +Copyright 2017-present Open Networking Foundation + +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. +*/ -}} + +{{- define "xos-ws.gateway_config" }} +default: + kafka_bootstrap_servers: {{ .Values.platformKafka | quote }} + xos: + host: xost + port: 9000 + gateway: + port: 3000 +{{- end }} + diff --git a/helm-charts/xos-gui/templates/gui-configmap.yaml b/helm-charts/xos-gui/templates/gui-configmap.yaml new file mode 100644 index 0000000..16d588c --- /dev/null +++ b/helm-charts/xos-gui/templates/gui-configmap.yaml @@ -0,0 +1,51 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: gui-app-config + labels: + {{- include "xos-gui.release_labels" . | indent 4 }} +data: + config: | +{{ include "xos-gui.app_config" . | indent 4 }} + +... +--- + +apiVersion: v1 +kind: ConfigMap +metadata: + name: gui-style-config + labels: + {{- include "xos-gui.release_labels" . | indent 4 }} +data: + config: | +{{ include "xos-gui.style_config" . | indent 4 }} + +... +--- + +apiVersion: v1 +kind: ConfigMap +metadata: + name: gui-cord-version + labels: + {{- include "xos-gui.release_labels" . | indent 4 }} +data: + config: | +{{ include "xos-gui.cord_version" . | indent 4 }} + diff --git a/helm-charts/xos-gui/templates/gui-deployment.yaml b/helm-charts/xos-gui/templates/gui-deployment.yaml new file mode 100644 index 0000000..d8d8b13 --- /dev/null +++ b/helm-charts/xos-gui/templates/gui-deployment.yaml @@ -0,0 +1,69 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: xos-gui + labels: + {{- include "xos-gui.release_labels" . | indent 4 }} +spec: + replicas: 1 + template: + metadata: + labels: + app: xos-gui + spec: + containers: + - name: xos-gui + image: {{ .Values.global.registry }}{{ .Values.images.xos_gui.repository }}:{{ tpl .Values.images.xos_gui.tag . }} + imagePullPolicy: {{ .Values.images.xos_gui.pullPolicy }} + ports: + - containerPort: 4000 + port: 4000 + protocol: TCP + volumeMounts: + - name: style-config + mountPath: /var/www/dist/style.config.js + subPath: style/style.config.js + - name: app-config + mountPath: /var/www/dist/app.config.js + subPath: app/app.config.js + - name: cord-version + mountPath: /var/www/dist/version.json + subPath: version.json + - name: extensions-volume + mountPath: /var/www/dist/extensions + volumes: + - name: style-config + configMap: + name: gui-style-config + items: + - key: config + path: style/style.config.js + - name: app-config + configMap: + name: gui-app-config + items: + - key: config + path: app/app.config.js + - name: cord-version + configMap: + name: gui-cord-version + items: + - key: config + path: version.json + - name: extensions-volume + emptyDir: {} diff --git a/helm-charts/xos-gui/templates/gui-service.yaml b/helm-charts/xos-gui/templates/gui-service.yaml new file mode 100644 index 0000000..2504f58 --- /dev/null +++ b/helm-charts/xos-gui/templates/gui-service.yaml @@ -0,0 +1,30 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Service +metadata: + name: "xos-gui" + labels: + {{- include "xos-gui.release_labels" . | indent 4 }} +spec: + type: NodePort + ports: + - port: 4000 + targetPort: 4000 + nodePort: {{ .Values.xos_guiNodePort }} + protocol: TCP + selector: + app: "xos-gui" diff --git a/helm-charts/xos-gui/templates/ws-configmap.yaml b/helm-charts/xos-gui/templates/ws-configmap.yaml new file mode 100644 index 0000000..f2caa68 --- /dev/null +++ b/helm-charts/xos-gui/templates/ws-configmap.yaml @@ -0,0 +1,25 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: xos-ws + labels: + {{- include "xos-gui.release_labels" . | indent 4 }} +data: + config: | +{{ include "xos-ws.gateway_config" . | indent 4 }} + diff --git a/helm-charts/xos-gui/templates/ws-deployment.yaml b/helm-charts/xos-gui/templates/ws-deployment.yaml new file mode 100644 index 0000000..e10d0f8 --- /dev/null +++ b/helm-charts/xos-gui/templates/ws-deployment.yaml @@ -0,0 +1,48 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: xos-ws + labels: + {{- include "xos-gui.release_labels" . | indent 4 }} +spec: + replicas: 1 + template: + metadata: + labels: + app: xos-ws + spec: + containers: + - name: xos-ws + image: {{ .Values.global.registry }}{{ .Values.images.xos_ws.repository }}:{{ tpl .Values.images.xos_ws.tag . }} + imagePullPolicy: {{ .Values.images.xos_ws.pullPolicy }} + command: ["npm", "start", "--", "--config", "gateway-config.yml"] + ports: + - containerPort: 3000 + port: 3000 + protocol: TCP + volumeMounts: + - name: gateway-config + mountPath: /var/www/src/config/gateway-config.yml + subPath: config/gateway-config.yml + volumes: + - name: gateway-config + configMap: + name: xos-ws + items: + - key: config + path: config/gateway-config.yml diff --git a/helm-charts/xos-gui/templates/ws-service.yaml b/helm-charts/xos-gui/templates/ws-service.yaml new file mode 100644 index 0000000..41c1a07 --- /dev/null +++ b/helm-charts/xos-gui/templates/ws-service.yaml @@ -0,0 +1,30 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Service +metadata: + name: "xos-ws" + labels: + {{- include "xos-gui.release_labels" . | indent 4 }} +spec: + type: NodePort + ports: + - port: 3000 + targetPort: 3000 + nodePort: {{ .Values.xos_wsNodePort }} + protocol: TCP + selector: + app: "xos-ws" diff --git a/helm-charts/xos-gui/values.yaml b/helm-charts/xos-gui/values.yaml new file mode 100644 index 0000000..7dbaea4 --- /dev/null +++ b/helm-charts/xos-gui/values.yaml @@ -0,0 +1,39 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +# Docker Images +images: + xos_gui: + repository: 'xosproject/xos-gui' + tag: "{{ .Chart.AppVersion }}" + pullPolicy: 'Always' + + xos_ws: + repository: 'xosproject/xos-rest-gw' + tag: '2.0.2' + pullPolicy: 'Always' + +global: + registry: "" + +# NodePorts +xos_guiNodePort: 30001 +xos_wsNodePort: 30008 + +platformKafka: cord-kafka:9092 + +xos_projectName: "CORD" + +cord_version: 6.1.0 diff --git a/helm-charts/xos-profiles/base-kubernetes/.helmignore b/helm-charts/xos-profiles/base-kubernetes/.helmignore new file mode 100644 index 0000000..f0c1319 --- /dev/null +++ b/helm-charts/xos-profiles/base-kubernetes/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/helm-charts/xos-profiles/base-kubernetes/Chart.yaml b/helm-charts/xos-profiles/base-kubernetes/Chart.yaml new file mode 100644 index 0000000..c973968 --- /dev/null +++ b/helm-charts/xos-profiles/base-kubernetes/Chart.yaml @@ -0,0 +1,22 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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: base-kubernetes +description: A Helm chart for XOS's "base-kubernetes" profile +icon: https://guide.opencord.org/logos/cord.svg +version: 1.1.0 + +# xosproject/tosca-loader version +appVersion: 1.3.0 diff --git a/helm-charts/xos-profiles/base-kubernetes/requirements.yaml b/helm-charts/xos-profiles/base-kubernetes/requirements.yaml new file mode 100644 index 0000000..70d31d9 --- /dev/null +++ b/helm-charts/xos-profiles/base-kubernetes/requirements.yaml @@ -0,0 +1,19 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +dependencies: +- name: kubernetes + version: 1.2.0 + repository: file://../../xos-services/kubernetes diff --git a/helm-charts/xos-profiles/base-kubernetes/templates/_helpers.tpl b/helm-charts/xos-profiles/base-kubernetes/templates/_helpers.tpl new file mode 100644 index 0000000..75cb5bd --- /dev/null +++ b/helm-charts/xos-profiles/base-kubernetes/templates/_helpers.tpl @@ -0,0 +1,52 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{/* +Expand the name of the chart. +*/}} +{{- define "base-kubernetes.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "base-kubernetes.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "base-kubernetes.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +The R-CORD synchronizer loads R-CORD-specific models into the core +*/}} + diff --git a/helm-charts/xos-profiles/base-kubernetes/templates/tosca-configmap.yaml b/helm-charts/xos-profiles/base-kubernetes/templates/tosca-configmap.yaml new file mode 100644 index 0000000..5da5d15 --- /dev/null +++ b/helm-charts/xos-profiles/base-kubernetes/templates/tosca-configmap.yaml @@ -0,0 +1,27 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: base-kubernetes-tosca +data: + 010-fixtures.yaml: | +{{ toYaml .Values.toscaRecipes.fixtures | indent 4 }} + 040-cord-services.yaml: | +{{ toYaml .Values.toscaRecipes.cordServices | indent 4 }} + 050-service-graph-constraints.yaml: | +{{ toYaml .Values.toscaRecipes.serviceGraphConstraints | indent 4 }} diff --git a/helm-charts/xos-profiles/base-kubernetes/templates/tosca-job.yaml b/helm-charts/xos-profiles/base-kubernetes/templates/tosca-job.yaml new file mode 100644 index 0000000..ec00369 --- /dev/null +++ b/helm-charts/xos-profiles/base-kubernetes/templates/tosca-job.yaml @@ -0,0 +1,55 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: batch/v1 +kind: Job +metadata: + name: {{ template "base-kubernetes.fullname" . }}-tosca-loader + labels: + app: {{ template "base-kubernetes.name" . }} + chart: {{ template "base-kubernetes.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + backoffLimit: 12 + template: + metadata: + labels: + app: {{ template "base-kubernetes.name" . }} + release: {{ .Release.Name }} + annotations: + checksum/config: {{ include (print $.Template.BasePath "/tosca-configmap.yaml") . | sha256sum }} + spec: + restartPolicy: OnFailure + containers: + - name: {{ .Chart.Name }}-tosca-loader + image: {{ .Values.global.registry }}{{ .Values.images.tosca_loader.repository }}:{{ tpl .Values.images.tosca_loader.tag . }} + imagePullPolicy: {{ .Values.images.tosca_loader.pullPolicy }} + env: + - name: XOS_USER + value: {{ .Values.xosAdminUser }} + - name: XOS_PASSWD + valueFrom: + secretKeyRef: + name: xos-admin-passwd-secret + key: password + volumeMounts: + - name: base-kubernetes-tosca + mountPath: /opt/tosca + volumes: + - name: base-kubernetes-tosca + configMap: + name: base-kubernetes-tosca diff --git a/helm-charts/xos-profiles/base-kubernetes/values.yaml b/helm-charts/xos-profiles/base-kubernetes/values.yaml new file mode 100644 index 0000000..68d2753 --- /dev/null +++ b/helm-charts/xos-profiles/base-kubernetes/values.yaml @@ -0,0 +1,131 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Default values for the base-kubernetes profile. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +nameOverride: "" +fullnameOverride: "" + +# tosca loader container +images: + tosca_loader: + repository: 'xosproject/tosca-loader' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + +global: + registry: "" + +xosAdminUser: "admin@opencord.org" +xosAdminPassword: "letmein" + +# TOSCA recipes for the tosca-loader +toscaRecipes: + fixtures: + tosca_definitions_version: tosca_simple_yaml_1_0 + description: Some basic fixtures + imports: + - custom_types/networkparametertype.yaml + - custom_types/networktemplate.yaml + topology_template: + node_templates: + # ----------------------------------------------------------------------------- + # Network Parameter Types + # ----------------------------------------------------------------------------- + s_tag: + type: tosca.nodes.NetworkParameterType + properties: + name: s_tag + c_tag: + type: tosca.nodes.NetworkParameterType + properties: + name: c_tag + next_hop: + type: tosca.nodes.NetworkParameterType + properties: + name: next_hop + device: + type: tosca.nodes.NetworkParameterType + properties: + name: device + bridge: + type: tosca.nodes.NetworkParameterType + properties: + name: bridge + neutron_port_name: + type: tosca.nodes.NetworkParameterType + properties: + name: neutron_port_name + + # ----------------------------------------------------------------------------- + # Network Templates + # ----------------------------------------------------------------------------- + Private: + type: tosca.nodes.NetworkTemplate + properties: + name: Private + visibility: private + translation: none + Public shared IPv4: + type: tosca.nodes.NetworkTemplate + properties: + name: Public shared IPv4 + visibility: private + translation: NAT + shared_network_name: nat-net + Public dedicated IPv4: + type: tosca.nodes.NetworkTemplate + properties: + name: Public dedicated IPv4 + visibility: public + translation: none + shared_network_name: ext-net + + cordServices: + tosca_definitions_version: tosca_simple_yaml_1_0 + description: Set up Kubernetes Service + imports: + - custom_types/kubernetesservice.yaml + - custom_types/trustdomain.yaml + topology_template: + node_templates: + default_trustdomain: + type: tosca.nodes.TrustDomain + properties: + name: "default" + requirements: + - owner: + node: service#kubernetes + relationship: tosca.relationships.BelongsToOne + service#kubernetes: + type: tosca.nodes.KubernetesService + properties: + name: kubernetes + + serviceGraphConstraints: + tosca_definitions_version: tosca_simple_yaml_1_0 + imports: + - custom_types/servicegraphconstraint.yaml + description: Constraints on the Services position in the graph + topology_template: + node_templates: + constraints: + type: tosca.nodes.ServiceGraphConstraint + properties: + constraints: '[]' diff --git a/helm-charts/xos-profiles/base-openstack/.helmignore b/helm-charts/xos-profiles/base-openstack/.helmignore new file mode 100644 index 0000000..f0c1319 --- /dev/null +++ b/helm-charts/xos-profiles/base-openstack/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/helm-charts/xos-profiles/base-openstack/Chart.yaml b/helm-charts/xos-profiles/base-openstack/Chart.yaml new file mode 100644 index 0000000..75a5e51 --- /dev/null +++ b/helm-charts/xos-profiles/base-openstack/Chart.yaml @@ -0,0 +1,22 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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: base-openstack +description: A Helm chart for the "base-openstack" profile +icon: https://guide.opencord.org/logos/cord.svg +version: 0.2.0 + +# xosproject/tosca-loader version +appVersion: 1.3.0 diff --git a/helm-charts/xos-profiles/base-openstack/files/node_key b/helm-charts/xos-profiles/base-openstack/files/node_key new file mode 100644 index 0000000..de2efc7 --- /dev/null +++ b/helm-charts/xos-profiles/base-openstack/files/node_key @@ -0,0 +1,18 @@ +# Copyright 2018-present Open Networking Foundation +# +# 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. + +########################################################## +# Overwrite this file with a private SSH key for logging # +# into the OpenStack compute nodes # +########################################################## diff --git a/helm-charts/xos-profiles/base-openstack/requirements.yaml b/helm-charts/xos-profiles/base-openstack/requirements.yaml new file mode 100644 index 0000000..af5211f --- /dev/null +++ b/helm-charts/xos-profiles/base-openstack/requirements.yaml @@ -0,0 +1,25 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +dependencies: +- name: onos-service + version: 2.1.0 + repository: file://../../xos-services/onos-service +- name: openstack + version: 1.1.6 + repository: file://../../xos-services/openstack +- name: vtn-service + version: 1.0.4 + repository: file://../../xos-services/vtn-service diff --git a/helm-charts/xos-profiles/base-openstack/templates/_helpers.tpl b/helm-charts/xos-profiles/base-openstack/templates/_helpers.tpl new file mode 100644 index 0000000..bd4fcce --- /dev/null +++ b/helm-charts/xos-profiles/base-openstack/templates/_helpers.tpl @@ -0,0 +1,47 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{/* +Expand the name of the chart. +*/}} +{{- define "base-openstack.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "base-openstack.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "base-openstack.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} diff --git a/helm-charts/xos-profiles/base-openstack/templates/_tosca.tpl b/helm-charts/xos-profiles/base-openstack/templates/_tosca.tpl new file mode 100644 index 0000000..e39f9a4 --- /dev/null +++ b/helm-charts/xos-profiles/base-openstack/templates/_tosca.tpl @@ -0,0 +1,229 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{- define "base-openstack.fixtureTosca" -}} +tosca_definitions_version: tosca_simple_yaml_1_0 + +imports: + - custom_types/deployment.yaml + - custom_types/site.yaml + - custom_types/networktemplate.yaml + - custom_types/network.yaml + - custom_types/networkslice.yaml + - custom_types/sitedeployment.yaml + +description: set up site and deployment and link them + +topology_template: + node_templates: + + {{ .Values.cordSiteName }}: + type: tosca.nodes.Site + properties: + name: {{ .Values.cordSiteName }} + site_url: http://mysite.opencord.us/ + hosts_nodes: true + +{{- end -}} + +{{- define "base-openstack.serviceGraphTosca" -}} +tosca_definitions_version: tosca_simple_yaml_1_0 + +imports: + - custom_types/onosapp.yaml + - custom_types/onosservice.yaml + - custom_types/servicedependency.yaml + - custom_types/servicegraphconstraint.yaml + - custom_types/servicedependency.yaml + - custom_types/serviceinstance.yaml + - custom_types/serviceinstancelink.yaml + - custom_types/vtnservice.yaml + +description: Configures the base-openstack service graph + +topology_template: + node_templates: + + service#vtn: + type: tosca.nodes.VTNService + properties: + name: vtn + must-exist: true + resync: false + + service#ONOS_CORD: + type: tosca.nodes.ONOSService + properties: + name: ONOS_CORD + must-exist: true + + # NOTE this is defined in the onos-service TOSCA + onos_app#vtn: + type: tosca.nodes.ONOSApp + properties: + name: vtn + must-exist: true + + # NOTE this is defined in the vtn-service TOSCA + vtn_service_instance: + type: tosca.nodes.ServiceInstance + properties: + name: VTN config + must-exist: true + + onos_app#vtn_VTN_Service: + type: tosca.nodes.ServiceInstanceLink + requirements: + - provider_service_instance: + node: onos_app#vtn + relationship: tosca.relationships.BelongsToOne + - subscriber_service: + node: service#vtn + relationship: tosca.relationships.BelongsToOne + + link#vtn_to_vtn-config: + type: tosca.nodes.ServiceInstanceLink + requirements: + - subscriber_service_instance: + node: vtn_service_instance + relationship: tosca.relationships.BelongsToOne + - provider_service_instance: + node: onos_app#vtn + relationship: tosca.relationships.BelongsToOne + + service_dependency#onos-cord_vtn: + type: tosca.nodes.ServiceDependency + properties: + connect_method: none + requirements: + - subscriber_service: + node: service#ONOS_CORD + relationship: tosca.relationships.BelongsToOne + - provider_service: + node: service#vtn + relationship: tosca.relationships.BelongsToOne +{{- end -}} + +{{- define "base-openstack.testTosca" -}} +tosca_definitions_version: tosca_simple_yaml_1_0 + +imports: + - custom_types/flavor.yaml + - custom_types/image.yaml + - custom_types/site.yaml + - custom_types/network.yaml + - custom_types/networkslice.yaml + - custom_types/slice.yaml + +description: for testing basic openstack functionality + +topology_template: + node_templates: + + Ubuntu-14.04: + type: tosca.nodes.Image + properties: + name: "Ubuntu 14.04 64-bit" + disk_format: QCOW2 + container_format: BARE + path: https://github.com/opencord/platform-install/releases/download/vms/trusty-server-cloudimg-amd64-disk1.img.20170201 + + {{ .Values.cordSiteName }}: + type: tosca.nodes.Site + properties: + name: {{ .Values.cordSiteName }} + must-exist: true + +# Define a test slice + {{ .Values.cordSiteName }}_test: + description: Test Slice + type: tosca.nodes.Slice + properties: + # network: noauto + name: {{ .Values.cordSiteName }}_test + requirements: + - site: + node: {{ .Values.cordSiteName }} + relationship: tosca.relationships.BelongsToOne + - default_image: + node: Ubuntu-14.04 + relationship: tosca.relationships.BelongsToOne + + management: + type: tosca.nodes.Network + properties: + name: management + must-exist: true + +# Connect test slice to management net + networkslice#management_to_{{ .Values.cordSiteName }}_test: + type: tosca.nodes.NetworkSlice + requirements: + - network: + node: management + relationship: tosca.relationships.BelongsToOne + - slice: + node: {{ .Values.cordSiteName }}_test + relationship: tosca.relationships.BelongsToOne +{{- end -}} + +{{- define "base-openstack.computeNodeTosca" -}} +tosca_definitions_version: tosca_simple_yaml_1_0 + +imports: + - custom_types/deployment.yaml + - custom_types/node.yaml + - custom_types/site.yaml + - custom_types/sitedeployment.yaml + +description: Adds OpenStack compute nodes + +topology_template: + node_templates: + +# Site/Deployment, fully defined in deployment.yaml + site: + type: tosca.nodes.Site + properties: + name: {{ .Values.cordSiteName }} + must-exist: true + + site_deployment: + type: tosca.nodes.SiteDeployment + requirements: + - site: + node: site + relationship: tosca.relationships.BelongsToOne + - deployment: + node: deployment + relationship: tosca.relationships.BelongsToOne + +# OpenStack compute nodes + + {{- range .Values.computeNodes }} + {{ .name }}: + type: tosca.nodes.Node + properties: + name: {{ .name }} + bridgeId: {{ .bridgeId }} + dataPlaneIntf: {{ .dataPlaneIntf }} + dataPlaneIp: {{ .dataPlaneIp }} + requirements: + - site_deployment: + node: site_deployment + relationship: tosca.relationships.BelongsToOne + {{- end }} +{{- end -}} diff --git a/helm-charts/xos-profiles/base-openstack/templates/secret.yaml b/helm-charts/xos-profiles/base-openstack/templates/secret.yaml new file mode 100644 index 0000000..01cf74b --- /dev/null +++ b/helm-charts/xos-profiles/base-openstack/templates/secret.yaml @@ -0,0 +1,23 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Secret +metadata: + name: node-key + namespace: default +type: Opaque +data: + node_key: {{ .Files.Get .Values.nodeKeyFile | b64enc }} \ No newline at end of file diff --git a/helm-charts/xos-profiles/base-openstack/templates/tosca-configmap.yaml b/helm-charts/xos-profiles/base-openstack/templates/tosca-configmap.yaml new file mode 100644 index 0000000..308fc83 --- /dev/null +++ b/helm-charts/xos-profiles/base-openstack/templates/tosca-configmap.yaml @@ -0,0 +1,38 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: base-openstack-tosca +data: + 010-fixtures.yaml: | +{{ include "base-openstack.fixtureTosca" . | indent 4 }} + 020-openstack-controller.yaml: | +{{ include "openstack.controllerTosca" .Values | indent 4 }} + 030-openstack-flavors.yaml: | +{{ include "openstack.flavorTosca" .Values.openstack | indent 4 }} + 040-onos-service-vtn-app.yaml: | +{{ include "onos-service.vtnAppTosca" (index .Values "onos-service") | indent 4 }} + 041-vtn-service.yaml: | +{{ include "vtn-service.serviceTosca" (index .Values "vtn-service") | indent 4 }} + 050-openstack-compute.yaml: | +{{ include "base-openstack.computeNodeTosca" . | indent 4 }} + 060-openstack-networks.yaml: | +{{ include "openstack.networkTosca" .Values | indent 4 }} + 300-service-graph.yaml: | +{{ include "base-openstack.serviceGraphTosca" . | indent 4 }} + diff --git a/helm-charts/xos-profiles/base-openstack/templates/tosca-job.yaml b/helm-charts/xos-profiles/base-openstack/templates/tosca-job.yaml new file mode 100644 index 0000000..48d0b9e --- /dev/null +++ b/helm-charts/xos-profiles/base-openstack/templates/tosca-job.yaml @@ -0,0 +1,54 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: batch/v1 +kind: Job +metadata: + name: {{ template "base-openstack.fullname" . }}-tosca-loader + labels: + app: {{ template "base-openstack.name" . }} + chart: {{ template "base-openstack.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + template: + metadata: + labels: + app: {{ template "base-openstack.name" . }} + release: {{ .Release.Name }} + annotations: + checksum/config: {{ include (print $.Template.BasePath "/tosca-configmap.yaml") . | sha256sum }} + spec: + restartPolicy: OnFailure + containers: + - name: {{ .Chart.Name }}-tosca-loader + image: {{ .Values.global.registry }}{{ .Values.image.repository }}:{{ tpl .Values.image.tag . }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + env: + - name: XOS_USER + value: {{ .Values.xosAdminUser }} + - name: XOS_PASSWD + valueFrom: + secretKeyRef: + name: xos-admin-passwd-secret + key: password + volumeMounts: + - name: base-openstack-tosca + mountPath: /opt/tosca + volumes: + - name: base-openstack-tosca + configMap: + name: base-openstack-tosca diff --git a/helm-charts/xos-profiles/base-openstack/values.yaml b/helm-charts/xos-profiles/base-openstack/values.yaml new file mode 100644 index 0000000..1dbda7e --- /dev/null +++ b/helm-charts/xos-profiles/base-openstack/values.yaml @@ -0,0 +1,52 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Default values for the base-openstack profile. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +nameOverride: "" +fullnameOverride: "" + +# tosca loader container +image: + repository: 'xosproject/tosca-loader' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + +global: + registry: "" + +xosAdminUser: "admin@opencord.org" +xosAdminPassword: "letmein" + +cordSiteName: &site "mysite" + +keystoneAdminUser: "admin" +keystoneAdminPassword: "password" +keystoneAdminTenant: "admin" +keystoneDomain: "Default" + +nodeKeyFile: "files/node_key" + +# List of compute nodes to add to XOS +computeNodes: + master: + name: node0.opencord.org + bridgeId: of:00000000abcdef01 + dataPlaneIntf: fabric + dataPlaneIp: 10.6.1.1/24 diff --git a/helm-charts/xos-profiles/demo-exampleservice/Chart.yaml b/helm-charts/xos-profiles/demo-exampleservice/Chart.yaml new file mode 100644 index 0000000..c5c2d6f --- /dev/null +++ b/helm-charts/xos-profiles/demo-exampleservice/Chart.yaml @@ -0,0 +1,24 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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: demo-exampleservice +description: A Helm chart that launches and configures ExampleService. It's assumed that base-kubernetes profile is installed. +icon: https://guide.opencord.org/logos/cord.svg + +version: 1.1.0 + +# xosproject/tosca-loader version +appVersion: 1.3.0 + diff --git a/helm-charts/xos-profiles/demo-exampleservice/requirements.yaml b/helm-charts/xos-profiles/demo-exampleservice/requirements.yaml new file mode 100644 index 0000000..2d21f8c --- /dev/null +++ b/helm-charts/xos-profiles/demo-exampleservice/requirements.yaml @@ -0,0 +1,22 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +dependencies: +- name: exampleservice + version: 2.2.4 + repository: file://../../xos-services/exampleservice +- name: addressmanager + version: 2.0.4 + repository: file://../../xos-services/addressmanager diff --git a/helm-charts/xos-profiles/demo-exampleservice/templates/_helpers.tpl b/helm-charts/xos-profiles/demo-exampleservice/templates/_helpers.tpl new file mode 100644 index 0000000..abeb4d4 --- /dev/null +++ b/helm-charts/xos-profiles/demo-exampleservice/templates/_helpers.tpl @@ -0,0 +1,47 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{/* +Expand the name of the chart. +*/}} +{{- define "demo-exampleservice.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "demo-exampleservice.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "demo-exampleservice.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} diff --git a/helm-charts/xos-profiles/demo-exampleservice/templates/_tosca.tpl b/helm-charts/xos-profiles/demo-exampleservice/templates/_tosca.tpl new file mode 100644 index 0000000..66c3279 --- /dev/null +++ b/helm-charts/xos-profiles/demo-exampleservice/templates/_tosca.tpl @@ -0,0 +1,111 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{- define "demo-exampleservice.publicNetworkTosca" -}} +tosca_definitions_version: tosca_simple_yaml_1_0 +description: Setup public network +imports: + - custom_types/addressmanagerservice.yaml + - custom_types/addressmanagerserviceinstance.yaml + - custom_types/addresspool.yaml + - custom_types/networktemplate.yaml + - custom_types/network.yaml + - custom_types/serviceinstancelink.yaml + - custom_types/site.yaml + - custom_types/slice.yaml +topology_template: + node_templates: + mysite: + type: tosca.nodes.Site + properties: + name: {{ .Values.cordSiteName }} + must-exist: true + + public_networking_slice: + description: This slice exists solely to own the public network + type: tosca.nodes.Slice + properties: + network: noauto + name: public_networking + requirements: + - site: + node: mysite + relationship: tosca.relationships.BelongsToOne + + # public network + public_template: + type: tosca.nodes.NetworkTemplate + properties: + name: public_template + visibility: public + translation: none + vtn_kind: PUBLIC + + public: + type: tosca.nodes.Network + properties: + name: public + permit_all_slices: true + subnet: {{ .Values.addresspool_public_cidr }} + # ip_version: 4 + requirements: + - template: + node: public_template + relationship: tosca.relationships.BelongsToOne + - owner: + node: public_networking_slice + relationship: tosca.relationships.BelongsToOne + + service#addressmanager: + type: tosca.nodes.AddressManagerService + properties: + name: addressmanager + + addresses_public: + type: tosca.nodes.AddressPool + properties: + name: addresses_public + addresses: {{ .Values.addresspool_public_cidr }} + gateway_ip: {{ .Values.addresspool_public_gateway_ip }} + gateway_mac: {{ .Values.addresspool_public_gateway_mac }} + requirements: + - service: + node: service#addressmanager + relationship: tosca.relationships.BelongsToOne + + AddressManagerServiceInstancePublicNetwork: + type: tosca.nodes.AddressManagerServiceInstance + requirements: + - owner: + node: service#addressmanager + relationship: tosca.relationships.BelongsToOne + - address_pool: + node: addresses_public + relationship: tosca.relationships.BelongsToOne + properties: + name: AM_public_net + + public_to_address_manager: + type: tosca.nodes.ServiceInstanceLink + requirements: + - provider_service_instance: + node: AddressManagerServiceInstancePublicNetwork + relationship: tosca.relationships.BelongsToOne + - subscriber_network: + node: public + relationship: tosca.relationships.BelongsToOne + +{{- end -}} diff --git a/helm-charts/xos-profiles/demo-exampleservice/templates/tosca-configmap.yaml b/helm-charts/xos-profiles/demo-exampleservice/templates/tosca-configmap.yaml new file mode 100644 index 0000000..1c7f0a7 --- /dev/null +++ b/helm-charts/xos-profiles/demo-exampleservice/templates/tosca-configmap.yaml @@ -0,0 +1,25 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: demo-exampleservice-tosca +data: + 010-publicnet.yaml: | +{{ include "demo-exampleservice.publicNetworkTosca" . | indent 4 }} + 050-exampleservice-service.yaml: | +{{ include "exampleservice.serviceTosca" .Values.exampleservice | indent 4 }} diff --git a/helm-charts/xos-profiles/demo-exampleservice/templates/tosca-job.yaml b/helm-charts/xos-profiles/demo-exampleservice/templates/tosca-job.yaml new file mode 100644 index 0000000..53cce60 --- /dev/null +++ b/helm-charts/xos-profiles/demo-exampleservice/templates/tosca-job.yaml @@ -0,0 +1,54 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: batch/v1 +kind: Job +metadata: + name: {{ template "demo-exampleservice.fullname" . }}-tosca-loader + labels: + app: {{ template "demo-exampleservice.name" . }} + chart: {{ template "demo-exampleservice.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + template: + metadata: + labels: + app: {{ template "demo-exampleservice.name" . }} + release: {{ .Release.Name }} + annotations: + checksum/config: {{ include (print $.Template.BasePath "/tosca-configmap.yaml") . | sha256sum }} + spec: + restartPolicy: OnFailure + containers: + - name: {{ .Chart.Name }}-tosca-loader + image: {{ .Values.global.registry }}{{ .Values.image.repository }}:{{ tpl .Values.image.tag . }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + env: + - name: XOS_USER + value: {{ .Values.xosAdminUser }} + - name: XOS_PASSWD + valueFrom: + secretKeyRef: + name: xos-admin-passwd-secret + key: password + volumeMounts: + - name: demo-exampleservice-tosca + mountPath: /opt/tosca + volumes: + - name: demo-exampleservice-tosca + configMap: + name: demo-exampleservice-tosca diff --git a/helm-charts/xos-profiles/demo-exampleservice/values.yaml b/helm-charts/xos-profiles/demo-exampleservice/values.yaml new file mode 100644 index 0000000..c2f3a78 --- /dev/null +++ b/helm-charts/xos-profiles/demo-exampleservice/values.yaml @@ -0,0 +1,42 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Default values for the demo-exampleservice profile. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +nameOverride: "" +fullnameOverride: "" + +image: + repository: 'xosproject/tosca-loader' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + +xosAdminUser: "admin@opencord.org" +xosAdminPassword: "letmein" + +cordSiteName: "mysite" + +addresspool_public_cidr: "10.8.1.0/24" +addresspool_public_gateway_ip: "10.8.1.1" +addresspool_public_gateway_mac: "a4:23:05:06:01:01" + +global: + proxySshEnabled: true + proxySshUser: root + registry: '' diff --git a/helm-charts/xos-profiles/demo-simpleexampleservice/Chart.yaml b/helm-charts/xos-profiles/demo-simpleexampleservice/Chart.yaml new file mode 100644 index 0000000..25c0ba0 --- /dev/null +++ b/helm-charts/xos-profiles/demo-simpleexampleservice/Chart.yaml @@ -0,0 +1,23 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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: demo-simpleexampleservice +description: A Helm chart that launches and configures SimpleExampleService. It's assumed that base-kubernetes profile is installed. +icon: https://guide.opencord.org/logos/cord.svg + +version: 1.1.0 + +# xosproject/tosca-loader version +appVersion: 1.3.0 diff --git a/helm-charts/xos-profiles/demo-simpleexampleservice/requirements.yaml b/helm-charts/xos-profiles/demo-simpleexampleservice/requirements.yaml new file mode 100644 index 0000000..b9cf45e --- /dev/null +++ b/helm-charts/xos-profiles/demo-simpleexampleservice/requirements.yaml @@ -0,0 +1,19 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +dependencies: +- name: simpleexampleservice + version: 1.2.0 + repository: file://../../xos-services/simpleexampleservice diff --git a/helm-charts/xos-profiles/demo-simpleexampleservice/templates/_helpers.tpl b/helm-charts/xos-profiles/demo-simpleexampleservice/templates/_helpers.tpl new file mode 100644 index 0000000..99ca409 --- /dev/null +++ b/helm-charts/xos-profiles/demo-simpleexampleservice/templates/_helpers.tpl @@ -0,0 +1,47 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{/* +Expand the name of the chart. +*/}} +{{- define "demo-simpleexampleservice.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "demo-simpleexampleservice.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "demo-simpleexampleservice.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} diff --git a/helm-charts/xos-profiles/demo-simpleexampleservice/templates/tests/test-demo-simpleexampleservice.yaml b/helm-charts/xos-profiles/demo-simpleexampleservice/templates/tests/test-demo-simpleexampleservice.yaml new file mode 100644 index 0000000..bfdcfb3 --- /dev/null +++ b/helm-charts/xos-profiles/demo-simpleexampleservice/templates/tests/test-demo-simpleexampleservice.yaml @@ -0,0 +1,45 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Pod +metadata: + name: "{{ .Release.Name }}-api-test" + annotations: + "helm.sh/hook": test-success +spec: + restartPolicy: Never + containers: + - name: {{ .Release.Name }}-api-test + image: {{ .Values.global.registry }}{{ .Values.images.xos_api_tester.repository }}:{{ tpl .Values.images.xos_api_tester.tag . }} + imagePullPolicy: {{ .Values.images.xos_api_tester.pullPolicy }} + volumeMounts: + - name: log-volume + mountPath: /src/cord-api/Tests/Log/ + env: + - name: SERVER_IP + value: 'xos-chameleon' + - name: SERVER_PORT + value: '9101' + - name: XOS_USER + value: {{ .Values.xosAdminUser | quote }} + - name: XOS_PASSWD + value: {{ .Values.xosAdminPassword | quote}} + command: ["pybot", "-L", "TRACE", "-d", "Log", "-T", "DemoSimpleExampleService.robot"] + volumes: + - name: log-volume + hostPath: + path: /tmp/helm_test_demo-simpleexampleservice_logs_{{ dateInZone "20060102T030405.00Z" (now) "UTC" }} + type: DirectoryOrCreate diff --git a/helm-charts/xos-profiles/demo-simpleexampleservice/templates/tosca-configmap.yaml b/helm-charts/xos-profiles/demo-simpleexampleservice/templates/tosca-configmap.yaml new file mode 100644 index 0000000..9ed3020 --- /dev/null +++ b/helm-charts/xos-profiles/demo-simpleexampleservice/templates/tosca-configmap.yaml @@ -0,0 +1,23 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: demo-simpleexampleservice-tosca +data: + 010-simpleexampleservice-service.yaml: | +{{ include "simpleexampleservice.serviceTosca" .Values.simpleexampleservice | indent 4 }} diff --git a/helm-charts/xos-profiles/demo-simpleexampleservice/templates/tosca-job.yaml b/helm-charts/xos-profiles/demo-simpleexampleservice/templates/tosca-job.yaml new file mode 100644 index 0000000..210e44f --- /dev/null +++ b/helm-charts/xos-profiles/demo-simpleexampleservice/templates/tosca-job.yaml @@ -0,0 +1,54 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: batch/v1 +kind: Job +metadata: + name: {{ template "demo-simpleexampleservice.fullname" . }}-tosca-loader + labels: + app: {{ template "demo-simpleexampleservice.name" . }} + chart: {{ template "demo-simpleexampleservice.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + template: + metadata: + labels: + app: {{ template "demo-simpleexampleservice.name" . }} + release: {{ .Release.Name }} + annotations: + checksum/config: {{ include (print $.Template.BasePath "/tosca-configmap.yaml") . | sha256sum }} + spec: + restartPolicy: OnFailure + containers: + - name: {{ .Chart.Name }}-tosca-loader + image: {{ .Values.global.registry }}{{ .Values.images.tosca_loader.repository }}:{{ tpl .Values.images.tosca_loader.tag . }} + imagePullPolicy: {{ .Values.images.tosca_loader.pullPolicy }} + env: + - name: XOS_USER + value: {{ .Values.xosAdminUser }} + - name: XOS_PASSWD + valueFrom: + secretKeyRef: + name: xos-admin-passwd-secret + key: password + volumeMounts: + - name: demo-simpleexampleservice-tosca + mountPath: /opt/tosca + volumes: + - name: demo-simpleexampleservice-tosca + configMap: + name: demo-simpleexampleservice-tosca diff --git a/helm-charts/xos-profiles/demo-simpleexampleservice/values.yaml b/helm-charts/xos-profiles/demo-simpleexampleservice/values.yaml new file mode 100644 index 0000000..1373cf5 --- /dev/null +++ b/helm-charts/xos-profiles/demo-simpleexampleservice/values.yaml @@ -0,0 +1,42 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Default values for the demo-simpleexampleservice profile. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +nameOverride: "" +fullnameOverride: "" + +images: + tosca_loader: + repository: 'xosproject/tosca-loader' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + + xos_api_tester: + repository: 'xosproject/xos-api-tester' + tag: 'master' + pullPolicy: 'Always' + +global: + registry: '' + +xosAdminUser: "admin@opencord.org" +xosAdminPassword: "letmein" + +cordSiteName: "mysite" diff --git a/helm-charts/xos-profiles/mcord/.helmignore b/helm-charts/xos-profiles/mcord/.helmignore new file mode 100644 index 0000000..f0c1319 --- /dev/null +++ b/helm-charts/xos-profiles/mcord/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/helm-charts/xos-profiles/mcord/Chart.yaml b/helm-charts/xos-profiles/mcord/Chart.yaml new file mode 100644 index 0000000..7aee752 --- /dev/null +++ b/helm-charts/xos-profiles/mcord/Chart.yaml @@ -0,0 +1,23 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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: mcord +description: A Helm chart for the "mcord" profile +icon: https://guide.opencord.org/logos/cord.svg + +version: 1.1.0 + +# xosproject/tosca-loader version +appVersion: 1.3.0 diff --git a/helm-charts/xos-profiles/mcord/requirements.yaml b/helm-charts/xos-profiles/mcord/requirements.yaml new file mode 100644 index 0000000..04dc926 --- /dev/null +++ b/helm-charts/xos-profiles/mcord/requirements.yaml @@ -0,0 +1,33 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +dependencies: +- name: onos-service + version: 2.1.0 + repository: file://../../xos-services/onos-service + condition: onos-service.enabled +- name: fabric + version: 2.2.0 + repository: file://../../xos-services/fabric + condition: fabric.enabled +- name: mcord-subscriber + version: 2.0.5 + repository: file://../../xos-services/mcord-subscriber +- name: progran + version: 2.0.7 + repository: file://../../xos-services/progran +- name: vrouter + version: 2.1.0 + repository: file://../../xos-services/vrouter diff --git a/helm-charts/xos-profiles/mcord/templates/_helpers.tpl b/helm-charts/xos-profiles/mcord/templates/_helpers.tpl new file mode 100644 index 0000000..0bd8908 --- /dev/null +++ b/helm-charts/xos-profiles/mcord/templates/_helpers.tpl @@ -0,0 +1,47 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{/* +Expand the name of the chart. +*/}} +{{- define "mcord.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "mcord.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "mcord.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} diff --git a/helm-charts/xos-profiles/mcord/templates/_tosca.tpl b/helm-charts/xos-profiles/mcord/templates/_tosca.tpl new file mode 100644 index 0000000..175f406 --- /dev/null +++ b/helm-charts/xos-profiles/mcord/templates/_tosca.tpl @@ -0,0 +1,250 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{- define "mcord.fixtureTosca" -}} +tosca_definitions_version: tosca_simple_yaml_1_0 + +imports: + - custom_types/deployment.yaml + - custom_types/site.yaml + +description: set up site and deployment and link them + +topology_template: + node_templates: + + {{ .Values.cordSiteName }}: + type: tosca.nodes.Site + properties: + name: {{ .Values.cordSiteName }} + site_url: http://mysite.opencord.us/ + hosts_nodes: true + +{{- end -}} + +{{- define "mcord.onosTosca" -}} +tosca_definitions_version: tosca_simple_yaml_1_0 + +imports: + - custom_types/onosapp.yaml + - custom_types/onosservice.yaml + - custom_types/serviceinstanceattribute.yaml + +description: Configures the VOLTHA ONOS service + +topology_template: + node_templates: + + service#onos: + type: tosca.nodes.ONOSService + properties: + name: onos + kind: data + rest_hostname: {{ .onosRestService | quote }} + rest_port: 8181 + + onos_app#segmentrouting: + type: tosca.nodes.ONOSApp + properties: + name: org.onosproject.segmentrouting + app_id: org.onosproject.segmentrouting + requirements: + - owner: + node: service#onos + relationship: tosca.relationships.BelongsToOne + + onos_app#netcfghostprovider: + type: tosca.nodes.ONOSApp + properties: + name: org.onosproject.netcfghostprovider + app_id: org.onosproject.netcfghostprovider + requirements: + - owner: + node: service#onos + relationship: tosca.relationships.BelongsToOne + + onos_app#openflow: + type: tosca.nodes.ONOSApp + properties: + name: org.onosproject.openflow + app_id: org.onosproject.openflow + requirements: + - owner: + node: service#onos + relationship: tosca.relationships.BelongsToOne +{{- end -}} + +{{- define "mcord.serviceGraphTosca" -}} +tosca_definitions_version: tosca_simple_yaml_1_0 + +imports: + - custom_types/fabricservice.yaml + - custom_types/mcordsubscriberservice.yaml + - custom_types/onosservice.yaml + - custom_types/progranservice.yaml + - custom_types/vrouterservice.yaml + - custom_types/servicegraphconstraint.yaml + - custom_types/servicedependency.yaml + - custom_types/service.yaml + +description: Configures the M-CORD service graph + +topology_template: + node_templates: + + service#progran: + type: tosca.nodes.ProgranService + properties: + name: progran + must-exist: true + + service#vrouter: + type: tosca.nodes.VRouterService + properties: + name: vrouter + must-exist: true + + service#mcord: + type: tosca.nodes.MCordSubscriberService + properties: + name: mcord + must-exist: true + + service#onos: + type: tosca.nodes.ONOSService + properties: + name: onos + must-exist: true + + service#fabric: + type: tosca.nodes.FabricService + properties: + name: fabric + must-exist: true + + service#epc-local: + type: tosca.nodes.Service + properties: + name: epc-local + + service#epc-remote: + type: tosca.nodes.Service + properties: + name: epc-remote + + service#cdn-local: + type: tosca.nodes.Service + properties: + name: cdn-local + + service#cdn-remote: + type: tosca.nodes.Service + properties: + name: cdn-remote + + service_dependency#epc_local_cdn_local: + type: tosca.nodes.ServiceDependency + properties: + connect_method: none + requirements: + - subscriber_service: + node: service#epc-local + relationship: tosca.relationships.BelongsToOne + - provider_service: + node: service#cdn-local + relationship: tosca.relationships.BelongsToOne + + service_dependency#cdn_local_cdn_remote: + type: tosca.nodes.ServiceDependency + properties: + connect_method: none + requirements: + - subscriber_service: + node: service#cdn-local + relationship: tosca.relationships.BelongsToOne + - provider_service: + node: service#cdn-remote + relationship: tosca.relationships.BelongsToOne + + service_dependency#mcord_progran: + type: tosca.nodes.ServiceDependency + properties: + connect_method: none + requirements: + - subscriber_service: + node: service#progran + relationship: tosca.relationships.BelongsToOne + - provider_service: + node: service#mcord + relationship: tosca.relationships.BelongsToOne + + service_dependency#progran_epc_local: + type: tosca.nodes.ServiceDependency + properties: + connect_method: none + requirements: + - subscriber_service: + node: service#epc-local + relationship: tosca.relationships.BelongsToOne + - provider_service: + node: service#progran + relationship: tosca.relationships.BelongsToOne + + service_dependency#epc_local_epc_remote: + type: tosca.nodes.ServiceDependency + properties: + connect_method: none + requirements: + - subscriber_service: + node: service#epc-remote + relationship: tosca.relationships.BelongsToOne + - provider_service: + node: service#epc-local + relationship: tosca.relationships.BelongsToOne + + service_dependency#onos-fabric_fabric: + type: tosca.nodes.ServiceDependency + properties: + connect_method: none + requirements: + - subscriber_service: + node: service#fabric + relationship: tosca.relationships.BelongsToOne + - provider_service: + node: service#onos + relationship: tosca.relationships.BelongsToOne + + service_dependency#vrouter_fabric: + type: tosca.nodes.ServiceDependency + properties: + connect_method: none + requirements: + - subscriber_service: + node: service#vrouter + relationship: tosca.relationships.BelongsToOne + - provider_service: + node: service#fabric + relationship: tosca.relationships.BelongsToOne + + constraints: + type: tosca.nodes.ServiceGraphConstraint + properties: +{{- if .Values.seba.enabled }} + constraints: '[ ["mcord", null, "onos"], ["progran", null, "fabric"], ["epc-local", null, null] ["epc-remote", null, null] ]' +{{ else }} + constraints: '[ ["mcord", null, "rcord", null], ["progran", null, "volt", "att-workflow-driver"], ["epc-local", "cdn-local", "fabric-crossconnect", "onos"], ["epc-remote", "cdn-remote", "vrouter", "fabric"] ]' +{{- end -}} +{{- end -}} diff --git a/helm-charts/xos-profiles/mcord/templates/tosca-configmap.yaml b/helm-charts/xos-profiles/mcord/templates/tosca-configmap.yaml new file mode 100644 index 0000000..253d045 --- /dev/null +++ b/helm-charts/xos-profiles/mcord/templates/tosca-configmap.yaml @@ -0,0 +1,37 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: mcord-tosca +data: + 010-onos-service.yaml: | +{{ include "mcord.onosTosca" .Values | indent 4 }} +{{- if .Values.fabric.enabled }} + 020-fabric-service.yaml: | +{{ include "fabric.serviceTosca" .Values.fabric | indent 4 }} +{{- end }} + 030-fixtures.yaml: | +{{ include "mcord.fixtureTosca" . | indent 4 }} + 040-progran-service.yaml: | +{{ include "progran.serviceTosca" .Values.progran | indent 4 }} + 050-vrouter-service.yaml: | +{{ include "vrouter.serviceTosca" .Values.vrouter | indent 4 }} + 100-mcord-subscriber-service.yaml: | +{{ include "mcord-subscriber.serviceTosca" (index .Values "mcord-subscriber") | indent 4 }} + 300-service-graph.yaml: | +{{ include "mcord.serviceGraphTosca" . | indent 4 }} diff --git a/helm-charts/xos-profiles/mcord/templates/tosca-job.yaml b/helm-charts/xos-profiles/mcord/templates/tosca-job.yaml new file mode 100644 index 0000000..5f72ce2 --- /dev/null +++ b/helm-charts/xos-profiles/mcord/templates/tosca-job.yaml @@ -0,0 +1,54 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: batch/v1 +kind: Job +metadata: + name: {{ template "mcord.fullname" . }}-tosca-loader + labels: + app: {{ template "mcord.name" . }} + chart: {{ template "mcord.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + template: + metadata: + labels: + app: {{ template "mcord.name" . }} + release: {{ .Release.Name }} + annotations: + checksum/config: {{ include (print $.Template.BasePath "/tosca-configmap.yaml") . | sha256sum }} + spec: + restartPolicy: OnFailure + containers: + - name: {{ .Chart.Name }}-tosca-loader + image: {{ .Values.global.registry }}{{ .Values.images.tosca_loader.repository }}:{{ tpl .Values.images.tosca_loader.tag . }} + imagePullPolicy: {{ .Values.images.tosca_loader.pullPolicy }} + env: + - name: XOS_USER + value: {{ .Values.xosAdminUser }} + - name: XOS_PASSWD + valueFrom: + secretKeyRef: + name: xos-admin-passwd-secret + key: password + volumeMounts: + - name: mcord-tosca + mountPath: /opt/tosca + volumes: + - name: mcord-tosca + configMap: + name: mcord-tosca diff --git a/helm-charts/xos-profiles/mcord/values.yaml b/helm-charts/xos-profiles/mcord/values.yaml new file mode 100644 index 0000000..15f110d --- /dev/null +++ b/helm-charts/xos-profiles/mcord/values.yaml @@ -0,0 +1,50 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Default values for the base-openstack profile. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +nameOverride: "" +fullnameOverride: "" + +images: + tosca_loader: + repository: 'xosproject/tosca-loader' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + +global: + registry: "" + +xosAdminUser: "admin@opencord.org" +xosAdminPassword: "letmein" + +cordSiteName: "mysite" + +onosRestService: "onos-ui.default.svc.cluster.local" +kafkaService: "cord-kafka.default.svc.cluster.local:9092" + +# whether to install or not this shared services +fabric: + enabled: true +onos-service: + enabled: true + +# wheter SEBA will be installed on the side or not +seba: + enabled: false \ No newline at end of file diff --git a/helm-charts/xos-profiles/ponsim-pod/Chart.yaml b/helm-charts/xos-profiles/ponsim-pod/Chart.yaml new file mode 100644 index 0000000..23c06b5 --- /dev/null +++ b/helm-charts/xos-profiles/ponsim-pod/Chart.yaml @@ -0,0 +1,23 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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: ponsim-pod +description: A Helm chart for loading the Ponsim pod's TOSCA files into XOS +icon: https://guide.opencord.org/logos/xos.svg + +version: 1.2.0 + +# xosproject/tosca-loader version +appVersion: 1.1.5 diff --git a/helm-charts/xos-profiles/ponsim-pod/templates/_helpers.tpl b/helm-charts/xos-profiles/ponsim-pod/templates/_helpers.tpl new file mode 100644 index 0000000..64b51f5 --- /dev/null +++ b/helm-charts/xos-profiles/ponsim-pod/templates/_helpers.tpl @@ -0,0 +1,48 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{/* +Expand the name of the chart. +*/}} +{{- define "ponsim-pod.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "ponsim-pod.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "ponsim-pod.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + diff --git a/helm-charts/xos-profiles/ponsim-pod/templates/tosca-configmap.yaml b/helm-charts/xos-profiles/ponsim-pod/templates/tosca-configmap.yaml new file mode 100644 index 0000000..9829f03 --- /dev/null +++ b/helm-charts/xos-profiles/ponsim-pod/templates/tosca-configmap.yaml @@ -0,0 +1,24 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: ponsim-pod-tosca +data: +{{- $workflowpath := printf "tosca/%s/*" .Values.workflow }} +{{ tpl (.Files.Glob $workflowpath).AsConfig . | indent 2 }} +{{ tpl (.Files.Glob "tosca/*").AsConfig . | indent 2 }} diff --git a/helm-charts/xos-profiles/ponsim-pod/templates/tosca-job.yaml b/helm-charts/xos-profiles/ponsim-pod/templates/tosca-job.yaml new file mode 100644 index 0000000..92d4cd1 --- /dev/null +++ b/helm-charts/xos-profiles/ponsim-pod/templates/tosca-job.yaml @@ -0,0 +1,56 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + + +apiVersion: batch/v1 +kind: Job +metadata: + name: {{ template "ponsim-pod.fullname" . }}-ponsim-pod + labels: + app: {{ template "ponsim-pod.name" . }} + chart: {{ template "ponsim-pod.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + backoffLimit: 12 + template: + metadata: + labels: + app: {{ template "ponsim-pod.name" . }} + release: {{ .Release.Name }} + annotations: + checksum/config: {{ include (print $.Template.BasePath "/tosca-configmap.yaml") . | sha256sum }} + spec: + restartPolicy: OnFailure + containers: + - name: {{ .Chart.Name }}-ponsim-pod + image: {{ .Values.global.registry }}{{ .Values.image.repository }}:{{ tpl .Values.image.tag . }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + env: + - name: XOS_USER + value: {{ .Values.xosAdminUser }} + - name: XOS_PASSWD + valueFrom: + secretKeyRef: + name: xos-admin-passwd-secret + key: password + volumeMounts: + - name: ponsim-pod-tosca + mountPath: /opt/tosca + volumes: + - name: ponsim-pod-tosca + configMap: + name: ponsim-pod-tosca diff --git a/helm-charts/xos-profiles/ponsim-pod/tosca/020-pod-olt.yaml b/helm-charts/xos-profiles/ponsim-pod/tosca/020-pod-olt.yaml new file mode 100644 index 0000000..724d56c --- /dev/null +++ b/helm-charts/xos-profiles/ponsim-pod/tosca/020-pod-olt.yaml @@ -0,0 +1,57 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +tosca_definitions_version: tosca_simple_yaml_1_0 +imports: + - custom_types/oltdevice.yaml + - custom_types/onudevice.yaml + - custom_types/ponport.yaml + - custom_types/voltservice.yaml +description: Create a simulated OLT Device in VOLTHA +topology_template: + node_templates: + + service#volt: + type: tosca.nodes.VOLTService + properties: + name: volt + must-exist: true + + olt_device: + type: tosca.nodes.OLTDevice + properties: + name: PONSIM OLT + device_type: ponsim_olt + host: olt.voltha.svc + port: 50060 + switch_datapath_id: of:0000000000000001 + switch_port: "2" + outer_tpid: "0x8100" + dp_id: of:0000aabbccddeeff + uplink: "2" + requirements: + - volt_service: + node: service#volt + relationship: tosca.relationships.BelongsToOne + + pon_port: + type: tosca.nodes.PONPort + properties: + name: pon0 + port_no: 1 + requirements: + - olt_device: + node: olt_device + relationship: tosca.relationships.BelongsToOne diff --git a/helm-charts/xos-profiles/ponsim-pod/tosca/030-fabric.yaml b/helm-charts/xos-profiles/ponsim-pod/tosca/030-fabric.yaml new file mode 100644 index 0000000..ce3dda8 --- /dev/null +++ b/helm-charts/xos-profiles/ponsim-pod/tosca/030-fabric.yaml @@ -0,0 +1,91 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +tosca_definitions_version: tosca_simple_yaml_1_0 +imports: + - custom_types/switch.yaml + - custom_types/onosapp.yaml + - custom_types/switchport.yaml + - custom_types/portinterface.yaml + - custom_types/bngportmapping.yaml + - custom_types/serviceinstanceattribute.yaml + +description: Configures the Ponsim SEBA POD fabric + +topology_template: + node_templates: + # Fabric configuration + switch#leaf_1: + type: tosca.nodes.Switch + properties: + driver: ofdpa-ovs + ipv4Loopback: 192.168.0.201 + ipv4NodeSid: 17 + isEdgeRouter: True + name: leaf_1 + ofId: of:0000000000000001 + routerMac: 00:00:02:01:06:01 + + # Setup the OLT switch port + port#olt_port: + type: tosca.nodes.SwitchPort + properties: + portId: 2 + host_learning: false + requirements: + - switch: + node: switch#leaf_1 + relationship: tosca.relationships.BelongsToOne + + # Port connected to the BNG + port#bng_port: + type: tosca.nodes.SwitchPort + properties: + portId: 1 + requirements: + - switch: + node: switch#leaf_1 + relationship: tosca.relationships.BelongsToOne + + # Setup the fabric switch port where the external + # router is connected to + bngmapping: + type: tosca.nodes.BNGPortMapping + properties: + s_tag: "any" + switch_port: 1 + + onos_app#dhcpl2relay: + type: tosca.nodes.ONOSApp + properties: + name: dhcpl2relay + must-exist: true + + # DHCP L2 Relay config + dhcpl2relay-config-attr: + type: tosca.nodes.ServiceInstanceAttribute + properties: + name: /onos/v1/network/configuration/apps/org.opencord.dhcpl2relay + value: > + { + "dhcpl2relay" : { + "useOltUplinkForServerPktInOut" : false, + "dhcpServerConnectPoints" : [ "of:0000000000000001/1" ] + } + } + requirements: + - service_instance: + node: onos_app#dhcpl2relay + relationship: tosca.relationships.BelongsToOne diff --git a/helm-charts/xos-profiles/ponsim-pod/tosca/040-subscriber.yaml b/helm-charts/xos-profiles/ponsim-pod/tosca/040-subscriber.yaml new file mode 100644 index 0000000..c806d2c --- /dev/null +++ b/helm-charts/xos-profiles/ponsim-pod/tosca/040-subscriber.yaml @@ -0,0 +1,58 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +tosca_definitions_version: tosca_simple_yaml_1_0 +imports: + - custom_types/rcordsubscriber.yaml +{{- if .Values.bandwidthProfiles }} + - custom_types/bandwidthprofile.yaml +{{- end }} + +description: Pre-provsion a subscriber + +topology_template: + node_templates: + +{{- if .Values.bandwidthProfiles }} + # Bronze bandwidthprofile for subscriber + bronze_bp: + type: tosca.nodes.BandwidthProfile + properties: + air: 99999 + cbs: 99999 + cir: 99999 + ebs: 99999 + eir: 99999 + name: Bronze +{{- end }} + + # Pre-provision the subscriber the subscriber + my_house: + type: tosca.nodes.RCORDSubscriber + properties: + name: QQClient + status: pre-provisioned + c_tag: 111 + s_tag: 222 + onu_device: PSMO12345678 +{{- if .Values.bandwidthProfiles }} + requirements: + - upstream_bps: + node: bronze_bp + relationship: tosca.relationships.BelongsToOne + - downstream_bps: + node: bronze_bp + relationship: tosca.relationships.BelongsToOne +{{- end }} \ No newline at end of file diff --git a/helm-charts/xos-profiles/ponsim-pod/tosca/att-workflow/010-att-workflow.yaml b/helm-charts/xos-profiles/ponsim-pod/tosca/att-workflow/010-att-workflow.yaml new file mode 100644 index 0000000..1af0eb2 --- /dev/null +++ b/helm-charts/xos-profiles/ponsim-pod/tosca/att-workflow/010-att-workflow.yaml @@ -0,0 +1,43 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# curl -H "xos-username: admin@opencord.org" -H "xos-password: letmein" -X POST --data-binary @oss-service.yaml http://10.90.0.101:30007/run + +tosca_definitions_version: tosca_simple_yaml_1_0 +imports: + - custom_types/servicedependency.yaml + - custom_types/voltservice.yaml + - custom_types/attworkflowdriverwhitelistentry.yaml + - custom_types/attworkflowdriverservice.yaml +description: Create an instance of the OSS Service and connect it to the vOLT Service +topology_template: + node_templates: + + service#att: + type: tosca.nodes.AttWorkflowDriverService + properties: + name: att-workflow-driver + must-exist: true + + whitelist: + type: tosca.nodes.AttWorkflowDriverWhiteListEntry + properties: + serial_number: PSMO12345678 + device_id: of:0000aabbccddeeff + pon_port_id: 1 + requirements: + - owner: + node: service#att + relationship: tosca.relationships.BelongsToOne diff --git a/helm-charts/xos-profiles/ponsim-pod/tosca/tt-workflow/010-tt-workflow.yaml b/helm-charts/xos-profiles/ponsim-pod/tosca/tt-workflow/010-tt-workflow.yaml new file mode 100644 index 0000000..c7a0bd7 --- /dev/null +++ b/helm-charts/xos-profiles/ponsim-pod/tosca/tt-workflow/010-tt-workflow.yaml @@ -0,0 +1,43 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# curl -H "xos-username: admin@opencord.org" -H "xos-password: letmein" -X POST --data-binary 010-tt-workflow.yaml http://10.90.0.101:30007/run + +tosca_definitions_version: tosca_simple_yaml_1_0 +imports: + - custom_types/servicedependency.yaml + - custom_types/voltservice.yaml + - custom_types/ttworkflowdriverwhitelistentry.yaml + - custom_types/ttworkflowdriverservice.yaml +description: Create an instance of the OSS Service and connect it to the vOLT Service +topology_template: + node_templates: + + service#tt: + type: tosca.nodes.TtWorkflowDriverService + properties: + name: tt-workflow-driver + must-exist: true + + whitelist: + type: tosca.nodes.TtWorkflowDriverWhiteListEntry + properties: + serial_number: PSMO12345678 + device_id: of:0000aabbccddeeff + pon_port_id: 1 + requirements: + - owner: + node: service#tt + relationship: tosca.relationships.BelongsToOne diff --git a/helm-charts/xos-profiles/ponsim-pod/values.yaml b/helm-charts/xos-profiles/ponsim-pod/values.yaml new file mode 100644 index 0000000..5cd5f22 --- /dev/null +++ b/helm-charts/xos-profiles/ponsim-pod/values.yaml @@ -0,0 +1,39 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Default values for the ponsim-pod profile. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +nameOverride: "" +fullnameOverride: "" + +image: + repository: 'xosproject/tosca-loader' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + +global: + registry: '' + +xosAdminUser: "admin@opencord.org" +xosAdminPassword: "letmein" + +# Supported workflows: att-workflow (AT&T) or tt-workflow (Turk Telekom) +workflow: att-workflow + +bandwidthProfiles: True diff --git a/helm-charts/xos-profiles/rcord-lite/.helmignore b/helm-charts/xos-profiles/rcord-lite/.helmignore new file mode 100644 index 0000000..f0c1319 --- /dev/null +++ b/helm-charts/xos-profiles/rcord-lite/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/helm-charts/xos-profiles/rcord-lite/Chart.yaml b/helm-charts/xos-profiles/rcord-lite/Chart.yaml new file mode 100644 index 0000000..5bb81ee --- /dev/null +++ b/helm-charts/xos-profiles/rcord-lite/Chart.yaml @@ -0,0 +1,22 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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: rcord-lite +description: A Helm chart for XOS's "rcord-lite" profile +icon: https://guide.opencord.org/logos/cord.svg +version: 1.1.0 + +# xosproject/tosca-loader version +appVersion: 1.3.0 diff --git a/helm-charts/xos-profiles/rcord-lite/requirements.yaml b/helm-charts/xos-profiles/rcord-lite/requirements.yaml new file mode 100644 index 0000000..a63d5c3 --- /dev/null +++ b/helm-charts/xos-profiles/rcord-lite/requirements.yaml @@ -0,0 +1,37 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +dependencies: +- name: rcord + version: 1.0.14 + repository: file://../../xos-services/rcord +- name: onos-service + version: 2.1.0 + repository: file://../../xos-services/onos-service +- name: fabric + version: 2.2.0 + repository: file://../../xos-services/fabric +- name: volt + version: 2.2.0 + repository: file://../../xos-services/volt +- name: vsg-hw + version: 1.1.0 + repository: file://../../xos-services/vsg-hw +- name: vrouter + version: 2.1.0 + repository: file://../../xos-services/vrouter +- name: sadis-server + version: 1.0.2 + repository: file://../../sadis-server diff --git a/helm-charts/xos-profiles/rcord-lite/templates/_helpers.tpl b/helm-charts/xos-profiles/rcord-lite/templates/_helpers.tpl new file mode 100644 index 0000000..8a503d0 --- /dev/null +++ b/helm-charts/xos-profiles/rcord-lite/templates/_helpers.tpl @@ -0,0 +1,51 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{/* +Expand the name of the chart. +*/}} +{{- define "rcord-lite.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "rcord-lite.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "rcord-lite.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +The R-CORD synchronizer loads R-CORD-specific models into the core +*/}} diff --git a/helm-charts/xos-profiles/rcord-lite/templates/_tosca.tpl b/helm-charts/xos-profiles/rcord-lite/templates/_tosca.tpl new file mode 100644 index 0000000..41e6d0f --- /dev/null +++ b/helm-charts/xos-profiles/rcord-lite/templates/_tosca.tpl @@ -0,0 +1,385 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} + +{{- define "rcord-lite.onosTosca" -}} +tosca_definitions_version: tosca_simple_yaml_1_0 +imports: + - custom_types/onosapp.yaml + - custom_types/onosservice.yaml + - custom_types/serviceinstanceattribute.yaml +description: ONOS service and app for fabric +topology_template: + node_templates: + service#ONOS: + type: tosca.nodes.ONOSService + properties: + name: ONOS + kind: data + rest_hostname: {{ .onosRestService | quote }} + rest_port: 8181 + + onos_app#segmentrouting: + type: tosca.nodes.ONOSApp + properties: + name: org.onosproject.segmentrouting + app_id: org.onosproject.segmentrouting + requirements: + - owner: + node: service#ONOS + relationship: tosca.relationships.BelongsToOne + + onos_app#vrouter: + type: tosca.nodes.ONOSApp + properties: + name: org.onosproject.vrouter + app_id: org.onosproject.vrouter + requirements: + - owner: + node: service#ONOS + relationship: tosca.relationships.BelongsToOne + + onos_app#netcfghostprovider: + type: tosca.nodes.ONOSApp + properties: + name: org.onosproject.netcfghostprovider + app_id: org.onosproject.netcfghostprovider + requirements: + - owner: + node: service#ONOS + relationship: tosca.relationships.BelongsToOne + + onos_app#openflow: + type: tosca.nodes.ONOSApp + properties: + name: org.onosproject.openflow + app_id: org.onosproject.openflow + requirements: + - owner: + node: service#ONOS + relationship: tosca.relationships.BelongsToOne + + onos_app#openflow-base: + type: tosca.nodes.ONOSApp + properties: + name: openflow-base + app_id: org.onosproject.openflow-base + requirements: + - owner: + node: service#ONOS + relationship: tosca.relationships.BelongsToOne + + onos_app#hostprovider: + type: tosca.nodes.ONOSApp + properties: + name: hostprovider + app_id: org.onosproject.hostprovider + requirements: + - owner: + node: service#ONOS + relationship: tosca.relationships.BelongsToOne + + onos_app#cord-config: + type: tosca.nodes.ONOSApp + properties: + name: cord-config + app_id: org.opencord.config + url: {{ .cordConfigAppURL }} + version: 1.4.0 + requirements: + - owner: + node: service#ONOS + relationship: tosca.relationships.BelongsToOne + + onos_app#olt: + type: tosca.nodes.ONOSApp + properties: + name: olt + app_id: org.opencord.olt + url: {{ .oltAppUrl }} + version: 2.0.0.SNAPSHOT + dependencies: org.opencord.config + requirements: + - owner: + node: service#ONOS + relationship: tosca.relationships.BelongsToOne + + onos_app#sadis: + type: tosca.nodes.ONOSApp + properties: + name: sadis + app_id: org.opencord.sadis + url: {{ .sadisAppUrl }} + version: 2.1.0 + requirements: + - owner: + node: service#ONOS + relationship: tosca.relationships.BelongsToOne + + onos_app#dhcpl2relay: + type: tosca.nodes.ONOSApp + properties: + name: dhcpl2relay + app_id: org.opencord.dhcpl2relay + url: {{ .dhcpl2relayAppUrl }} + version: 1.5.0.SNAPSHOT + dependencies: org.opencord.sadis + requirements: + - owner: + node: service#ONOS + relationship: tosca.relationships.BelongsToOne + + onos_app#aaa: + type: tosca.nodes.ONOSApp + properties: + name: aaa + app_id: org.opencord.aaa + url: {{ .aaaAppUrl }} + version: 1.8.0.SNAPSHOT + dependencies: org.opencord.sadis + requirements: + - owner: + node: service#ONOS + relationship: tosca.relationships.BelongsToOne + + onos_app#kafka: + type: tosca.nodes.ONOSApp + properties: + name: kafka + app_id: org.opencord.kafka + url: {{ .kafkaAppUrl }} + version: 1.0.0.SNAPSHOT + dependencies: org.opencord.olt,org.opencord.aaa,org.opencord.dhcpl2relay + requirements: + - owner: + node: service#ONOS + relationship: tosca.relationships.BelongsToOne + + # CORD-Configuration + cord-config-attr: + type: tosca.nodes.ServiceInstanceAttribute + properties: + name: /onos/v1/network/configuration/apps/org.opencord.kafka + value: > + { + "kafka" : { + "bootstrapServers" : {{ .kafkaService | quote }} + } + } + requirements: + - service_instance: + node: onos_app#olt + relationship: tosca.relationships.BelongsToOne + + olt-config-attr: + type: tosca.nodes.ServiceInstanceAttribute + properties: + name: /onos/v1/configuration/org.opencord.olt.impl.Olt?preset=true + value: > + { + "enableDhcpOnProvisioning" : true + } + requirements: + - service_instance: + node: onos_app#olt + relationship: tosca.relationships.BelongsToOne + + dhcpl2relay-config-attr: + type: tosca.nodes.ServiceInstanceAttribute + properties: + name: /onos/v1/network/configuration/apps/org.opencord.dhcpl2relay + value: > + { + "dhcpl2relay" : { + "useOltUplinkForServerPktInOut" : true + } + } + requirements: + - service_instance: + node: onos_app#dhcpl2relay + relationship: tosca.relationships.BelongsToOne + + aaa-config-attr: + type: tosca.nodes.ServiceInstanceAttribute + properties: + name: /onos/v1/network/configuration/apps/org.opencord.aaa + value: > + { + "AAA" : { + "radiusConnectionType" : "socket", + "radiusHost" : "freeradius.voltha.svc.cluster.local", + "radiusServerPort" : "1812", + "radiusSecret" : "SECRET" + } + } + requirements: + - service_instance: + node: onos_app#aaa + relationship: tosca.relationships.BelongsToOne + + sadis-config-attr: + type: tosca.nodes.ServiceInstanceAttribute + properties: + name: /onos/v1/network/configuration/apps/org.opencord.sadis + value: > + { + "sadis" : { + "integration" : { + "cache" : { + "maxsize" : 1000 + }, + "url" : "http://sadis-service:8000/subscriber/%s" + } + } + } + requirements: + - service_instance: + node: onos_app#sadis + relationship: tosca.relationships.BelongsToOne +{{- end -}} + +{{- define "rcord-lite.serviceGraphTosca" -}} +tosca_definitions_version: tosca_simple_yaml_1_0 +imports: + - custom_types/fabricservice.yaml + - custom_types/onosservice.yaml + - custom_types/rcordservice.yaml + - custom_types/vrouterservice.yaml + - custom_types/voltservice.yaml + - custom_types/vsghwservice.yaml + - custom_types/servicedependency.yaml + - custom_types/servicegraphconstraint.yaml +description: rcord-lite service graph +topology_template: + node_templates: + +# These services must be defined before loading the graph + + service#ONOS: + type: tosca.nodes.ONOSService + properties: + name: ONOS + must-exist: true + + service#fabric: + type: tosca.nodes.FabricService + properties: + name: fabric + must-exist: true + + service#rcord: + type: tosca.nodes.RCORDService + properties: + name: rcord + must-exist: true + + service#vrouter: + type: tosca.nodes.VRouterService + properties: + name: vrouter + must-exist: true + + service#volt: + type: tosca.nodes.VOLTService + properties: + name: volt + must-exist: true + + service#vsg-hw: + type: tosca.nodes.VSGHWService + properties: + name: vsg-hw + must-exist: true + +# The rcord-lite service graph + + service_dependency#onos-fabric_fabric: + type: tosca.nodes.ServiceDependency + properties: + connect_method: none + requirements: + - subscriber_service: + node: service#fabric + relationship: tosca.relationships.BelongsToOne + - provider_service: + node: service#ONOS + relationship: tosca.relationships.BelongsToOne + + service_dependency#rcord_volt: + type: tosca.nodes.ServiceDependency + properties: + connect_method: none + requirements: + - subscriber_service: + node: service#rcord + relationship: tosca.relationships.BelongsToOne + - provider_service: + node: service#volt + relationship: tosca.relationships.BelongsToOne + + service_dependency#onos_voltha_volt: + type: tosca.nodes.ServiceDependency + properties: + connect_method: none + requirements: + - subscriber_service: + node: service#volt + relationship: tosca.relationships.BelongsToOne + - provider_service: + node: service#ONOS + relationship: tosca.relationships.BelongsToOne + + service_dependency#fabric_vrouter: + type: tosca.nodes.ServiceDependency + properties: + connect_method: none + requirements: + - subscriber_service: + node: service#vrouter + relationship: tosca.relationships.BelongsToOne + - provider_service: + node: service#fabric + relationship: tosca.relationships.BelongsToOne + + service_dependency#volt_vsg-hw: + type: tosca.nodes.ServiceDependency + properties: + connect_method: none + requirements: + - subscriber_service: + node: service#volt + relationship: tosca.relationships.BelongsToOne + - provider_service: + node: service#vsg-hw + relationship: tosca.relationships.BelongsToOne + + service_dependency#onos_fabric_vsg-hw: + type: tosca.nodes.ServiceDependency + properties: + connect_method: none + requirements: + - subscriber_service: + node: service#vsg-hw + relationship: tosca.relationships.BelongsToOne + - provider_service: + node: service#ONOS + relationship: tosca.relationships.BelongsToOne + + constraints: + type: tosca.nodes.ServiceGraphConstraint + properties: + constraints: '[[null, "rcord"], [null, "volt"], ["ONOS", "vsg-hw"], ["fabric", null], ["vrouter", null]]' +{{- end -}} diff --git a/helm-charts/xos-profiles/rcord-lite/templates/tests/test-rcord-lite-api.yaml b/helm-charts/xos-profiles/rcord-lite/templates/tests/test-rcord-lite-api.yaml new file mode 100644 index 0000000..a17884f --- /dev/null +++ b/helm-charts/xos-profiles/rcord-lite/templates/tests/test-rcord-lite-api.yaml @@ -0,0 +1,45 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Pod +metadata: + name: "{{ .Release.Name }}-api-test" + annotations: + "helm.sh/hook": test-success +spec: + restartPolicy: Never + containers: + - name: {{ .Release.Name }}-api-test + image: {{ .Values.global.registry }}{{ .Values.images.xos_api_tester.repository }}:{{ tpl .Values.images.xos_api_tester.tag . }} + imagePullPolicy: {{ .Values.images.xos_api_tester.pullPolicy }} + volumeMounts: + - name: log-volume + mountPath: /src/cord-api/Tests/Log/ + env: + - name: SERVER_IP + value: 'xos-chameleon' + - name: SERVER_PORT + value: '9101' + - name: XOS_USER + value: {{ .Values.xosAdminUser | quote }} + - name: XOS_PASSWD + value: {{ .Values.xosAdminPassword | quote}} + command: ["pybot", "-L", "TRACE", "-d", "Log", "-T", "VOLTDevice_Test.txt", "RCORDLite_E2ETest.txt"] + volumes: + - name: log-volume + hostPath: + path: /tmp/helm_test_rcord_lite_logs_{{ dateInZone "20060102T030405.00Z" (now) "UTC" }} + type: DirectoryOrCreate diff --git a/helm-charts/xos-profiles/rcord-lite/templates/tosca-configmap.yaml b/helm-charts/xos-profiles/rcord-lite/templates/tosca-configmap.yaml new file mode 100644 index 0000000..3321ce9 --- /dev/null +++ b/helm-charts/xos-profiles/rcord-lite/templates/tosca-configmap.yaml @@ -0,0 +1,35 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: rcord-lite-tosca +data: + 020-rcord-subscriber-service.yaml: | +{{ include "rcord.serviceTosca" .Values.rcord | indent 4 }} + 030-volt-service.yaml: | +{{ include "volt.serviceTosca" .Values.volt | indent 4 }} + 040-vsg-hw-service.yaml: | +{{ include "vsg-hw.serviceTosca" (index .Values "vsg-hw") | indent 4 }} + 050-vrouter-service.yaml: | +{{ include "vrouter.serviceTosca" .Values.vrouter | indent 4 }} + 060-onos-service-fabric.yaml: | +{{ include "rcord-lite.onosTosca" .Values | indent 4 }} + 070-fabric-service.yaml: | +{{ include "fabric.serviceTosca" .Values.fabric | indent 4 }} + 300-service-graph.yaml: | +{{ include "rcord-lite.serviceGraphTosca" . | indent 4 }} diff --git a/helm-charts/xos-profiles/rcord-lite/templates/tosca-job.yaml b/helm-charts/xos-profiles/rcord-lite/templates/tosca-job.yaml new file mode 100644 index 0000000..d1a83a2 --- /dev/null +++ b/helm-charts/xos-profiles/rcord-lite/templates/tosca-job.yaml @@ -0,0 +1,55 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: batch/v1 +kind: Job +metadata: + name: {{ template "rcord-lite.fullname" . }}-tosca-loader + labels: + app: {{ template "rcord-lite.name" . }} + chart: {{ template "rcord-lite.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + backoffLimit: 12 + template: + metadata: + labels: + app: {{ template "rcord-lite.name" . }} + release: {{ .Release.Name }} + annotations: + checksum/config: {{ include (print $.Template.BasePath "/tosca-configmap.yaml") . | sha256sum }} + spec: + restartPolicy: OnFailure + containers: + - name: {{ .Chart.Name }}-tosca-loader + image: {{ .Values.global.registry }}{{ .Values.images.tosca_loader.repository }}:{{ tpl .Values.images.tosca_loader.tag . }} + imagePullPolicy: {{ .Values.images.tosca_loader.pullPolicy }} + env: + - name: XOS_USER + value: {{ .Values.xosAdminUser }} + - name: XOS_PASSWD + valueFrom: + secretKeyRef: + name: xos-admin-passwd-secret + key: password + volumeMounts: + - name: rcord-lite-tosca + mountPath: /opt/tosca + volumes: + - name: rcord-lite-tosca + configMap: + name: rcord-lite-tosca diff --git a/helm-charts/xos-profiles/rcord-lite/values.yaml b/helm-charts/xos-profiles/rcord-lite/values.yaml new file mode 100644 index 0000000..33a1135 --- /dev/null +++ b/helm-charts/xos-profiles/rcord-lite/values.yaml @@ -0,0 +1,53 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Default values for the rcord-lite profile. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +nameOverride: "" +fullnameOverride: "" + +images: + tosca_loader: + repository: 'xosproject/tosca-loader' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + + xos_api_tester: + repository: 'xosproject/xos-api-tester' + tag: 'master' + pullPolicy: 'Always' + +global: + registry: '' + +xosAdminUser: "admin@opencord.org" +xosAdminPassword: "letmein" + +cordConfigAppURL: "https://oss.sonatype.org/service/local/repositories/releases/content/org/opencord/cord-config/1.4.0/cord-config-1.4.0.oar" +vtnAppURL: "https://oss.sonatype.org/service/local/repositories/releases/content/org/opencord/vtn/1.6.0/vtn-1.6.0.oar" + +# onos-voltha applications +oltAppUrl: "https://oss.sonatype.org/service/local/artifact/maven/redirect?r=snapshots&g=org.opencord&a=olt-app&v=2.0.0-SNAPSHOT&e=oar" +sadisAppUrl: "https://oss.sonatype.org/service/local/repositories/releases/content/org/opencord/sadis-app/2.1.0/sadis-app-2.1.0.oar" +dhcpl2relayAppUrl: "https://oss.sonatype.org/service/local/artifact/maven/redirect?r=snapshots&g=org.opencord&a=dhcpl2relay&v=1.5.0-SNAPSHOT&e=oar" +aaaAppUrl: "https://oss.sonatype.org/service/local/artifact/maven/redirect?r=snapshots&g=org.opencord&a=aaa&v=1.8.0-SNAPSHOT&e=oar" +kafkaAppUrl: "https://oss.sonatype.org/service/local/artifact/maven/redirect?r=snapshots&g=org.opencord&a=kafka&v=1.0.0-SNAPSHOT&e=oar" + +onosRestService: "onos-ui.default.svc.cluster.local" +kafkaService: "cord-kafka.default.svc.cluster.local:9092" diff --git a/helm-charts/xos-profiles/seba-services/Chart.yaml b/helm-charts/xos-profiles/seba-services/Chart.yaml new file mode 100644 index 0000000..eed0129 --- /dev/null +++ b/helm-charts/xos-profiles/seba-services/Chart.yaml @@ -0,0 +1,23 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +name: seba-services +description: A Helm chart for XOS's "SEBA" profile +icon: https://guide.opencord.org/logos/cord.svg +version: 1.2.1 + +# xosproject/tosca-loader version +appVersion: 1.3.0 diff --git a/helm-charts/xos-profiles/seba-services/requirements.yaml b/helm-charts/xos-profiles/seba-services/requirements.yaml new file mode 100644 index 0000000..fbe7ee6 --- /dev/null +++ b/helm-charts/xos-profiles/seba-services/requirements.yaml @@ -0,0 +1,36 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +dependencies: +- name: rcord + version: 1.0.14 + repository: file://../../xos-services/rcord +- name: onos-service + version: 2.1.0 + repository: file://../../xos-services/onos-service + condition: onos-service.enabled +- name: fabric + version: 2.2.0 + repository: file://../../xos-services/fabric + condition: fabric.enabled +- name: volt + version: 2.2.0 + repository: file://../../xos-services/volt +- name: fabric-crossconnect + version: 1.2.0 + repository: file://../../xos-services/fabric-crossconnect +- name: sadis-server + version: 1.0.2 + repository: file://../../sadis-server diff --git a/helm-charts/xos-profiles/seba-services/templates/_helpers.tpl b/helm-charts/xos-profiles/seba-services/templates/_helpers.tpl new file mode 100644 index 0000000..6519e2f --- /dev/null +++ b/helm-charts/xos-profiles/seba-services/templates/_helpers.tpl @@ -0,0 +1,47 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{/* +Expand the name of the chart. +*/}} +{{- define "seba-services.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "seba-services.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "seba-services.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} diff --git a/helm-charts/xos-profiles/seba-services/templates/_tosca.tpl b/helm-charts/xos-profiles/seba-services/templates/_tosca.tpl new file mode 100644 index 0000000..712f176 --- /dev/null +++ b/helm-charts/xos-profiles/seba-services/templates/_tosca.tpl @@ -0,0 +1,357 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{- define "seba-services.onosTosca" -}} +tosca_definitions_version: tosca_simple_yaml_1_0 + +imports: + - custom_types/onosapp.yaml + - custom_types/onosservice.yaml + - custom_types/serviceinstanceattribute.yaml + +description: Configures the VOLTHA ONOS service + +topology_template: + node_templates: + + service#onos: + type: tosca.nodes.ONOSService + properties: + name: onos + kind: data + rest_hostname: {{ .onosRestService | quote }} + rest_port: 8181 + + onos_app#openflow-base: + type: tosca.nodes.ONOSApp + properties: + name: openflow-base + app_id: org.onosproject.openflow-base + requirements: + - owner: + node: service#onos + relationship: tosca.relationships.BelongsToOne + + onos_app#hostprovider: + type: tosca.nodes.ONOSApp + properties: + name: hostprovider + app_id: org.onosproject.hostprovider + requirements: + - owner: + node: service#onos + relationship: tosca.relationships.BelongsToOne + + onos_app#olt: + type: tosca.nodes.ONOSApp + properties: + name: olt + app_id: org.opencord.olt + url: {{ .oltAppUrl }} + version: {{ .oltAppVersion }} + dependencies: org.opencord.sadis + requirements: + - owner: + node: service#onos + relationship: tosca.relationships.BelongsToOne + + onos_app#sadis: + type: tosca.nodes.ONOSApp + properties: + name: sadis + app_id: org.opencord.sadis + url: {{ .sadisAppUrl }} + version: {{ .sadisAppVersion }} + requirements: + - owner: + node: service#onos + relationship: tosca.relationships.BelongsToOne + + onos_app#dhcpl2relay: + type: tosca.nodes.ONOSApp + properties: + name: dhcpl2relay + app_id: org.opencord.dhcpl2relay + url: {{ .dhcpl2relayAppUrl }} + version: {{ .dhcpl2relayAppVersion }} + dependencies: org.opencord.sadis + requirements: + - owner: + node: service#onos + relationship: tosca.relationships.BelongsToOne + + onos_app#kafka: + type: tosca.nodes.ONOSApp + properties: + name: kafka + app_id: org.opencord.kafka + url: {{ .kafkaAppUrl }} + version: {{ .kafkaAppVersion }} + requirements: + - owner: + node: service#onos + relationship: tosca.relationships.BelongsToOne + + # CORD-Configuration + kafka-config-attr: + type: tosca.nodes.ServiceInstanceAttribute + properties: + name: /onos/v1/network/configuration/apps/org.opencord.kafka + value: > + { + "kafka" : { + "bootstrapServers" : {{ .kafkaService | quote }} + } + } + requirements: + - service_instance: + node: onos_app#kafka + relationship: tosca.relationships.BelongsToOne + + sadis-config-attr: + type: tosca.nodes.ServiceInstanceAttribute + properties: + name: /onos/v1/network/configuration/apps/org.opencord.sadis + value: > + { + "sadis" : { + "integration" : { + "cache" : { + "maxsize" : 1000, + "ttl": "PT300S" + }, + "url" : "http://sadis-service:8000/subscriber/%s" + } + }, + "bandwidthprofile":{ + "integration":{ + "url": "http://sadis-service:8000/bandwidthprofiles/%s", + "cache":{ + "enabled":true, + "maxsize":40, + "ttl":"PT1m" + } + } + } + } + requirements: + - service_instance: + node: onos_app#sadis + relationship: tosca.relationships.BelongsToOne + + onos_app#segmentrouting: + type: tosca.nodes.ONOSApp + properties: + name: org.onosproject.segmentrouting + app_id: org.onosproject.segmentrouting + requirements: + - owner: + node: service#onos + relationship: tosca.relationships.BelongsToOne + + onos_app#netcfghostprovider: + type: tosca.nodes.ONOSApp + properties: + name: org.onosproject.netcfghostprovider + app_id: org.onosproject.netcfghostprovider + requirements: + - owner: + node: service#onos + relationship: tosca.relationships.BelongsToOne + + onos_app#openflow: + type: tosca.nodes.ONOSApp + properties: + name: org.onosproject.openflow + app_id: org.onosproject.openflow + requirements: + - owner: + node: service#onos + relationship: tosca.relationships.BelongsToOne +{{- end -}} + +{{- define "seba-services.basicFixturesTosca" -}} +tosca_definitions_version: tosca_simple_yaml_1_0 +description: Some basic fixtures +imports: + - custom_types/networkparametertype.yaml + - custom_types/networktemplate.yaml +topology_template: + node_templates: + +# ----------------------------------------------------------------------------- +# Network Parameter Types +# ----------------------------------------------------------------------------- + s_tag: + type: tosca.nodes.NetworkParameterType + properties: + name: s_tag + c_tag: + type: tosca.nodes.NetworkParameterType + properties: + name: c_tag + next_hop: + type: tosca.nodes.NetworkParameterType + properties: + name: next_hop + device: + type: tosca.nodes.NetworkParameterType + properties: + name: device + bridge: + type: tosca.nodes.NetworkParameterType + properties: + name: bridge + neutron_port_name: + type: tosca.nodes.NetworkParameterType + properties: + name: neutron_port_name + +# ----------------------------------------------------------------------------- +# Network Templates +# ----------------------------------------------------------------------------- + Private: + type: tosca.nodes.NetworkTemplate + properties: + name: Private + visibility: private + translation: none + + Public shared IPv4: + type: tosca.nodes.NetworkTemplate + properties: + name: Public shared IPv4 + visibility: private + translation: NAT + shared_network_name: nat-net + + Public dedicated IPv4: + type: tosca.nodes.NetworkTemplate + properties: + name: Public dedicated IPv4 + visibility: public + translation: none + shared_network_name: ext-net + +{{- end -}} + + +{{- define "seba-services.serviceGraphTosca" -}} +tosca_definitions_version: tosca_simple_yaml_1_0 +imports: + - custom_types/fabricservice.yaml + - custom_types/onosservice.yaml + - custom_types/rcordservice.yaml + - custom_types/voltservice.yaml + - custom_types/fabriccrossconnectservice.yaml + - custom_types/servicedependency.yaml + - custom_types/servicegraphconstraint.yaml +description: seba service graph +topology_template: + node_templates: + +# These services must be defined before loading the graph + + service#onos: + type: tosca.nodes.ONOSService + properties: + name: onos + must-exist: true + + service#fabric: + type: tosca.nodes.FabricService + properties: + name: fabric + must-exist: true + + service#rcord: + type: tosca.nodes.RCORDService + properties: + name: rcord + must-exist: true + + service#volt: + type: tosca.nodes.VOLTService + properties: + name: volt + must-exist: true + + service#fabric-crossconnect: + type: tosca.nodes.FabricCrossconnectService + properties: + name: fabric-crossconnect + must-exist: true + + service_dependency#onos-fabric_fabric: + type: tosca.nodes.ServiceDependency + properties: + connect_method: none + requirements: + - subscriber_service: + node: service#fabric + relationship: tosca.relationships.BelongsToOne + - provider_service: + node: service#onos + relationship: tosca.relationships.BelongsToOne + + service_dependency#rcord_volt: + type: tosca.nodes.ServiceDependency + properties: + connect_method: none + requirements: + - subscriber_service: + node: service#rcord + relationship: tosca.relationships.BelongsToOne + - provider_service: + node: service#volt + relationship: tosca.relationships.BelongsToOne + + service_dependency#onos_volt: + type: tosca.nodes.ServiceDependency + properties: + connect_method: none + requirements: + - subscriber_service: + node: service#onos + relationship: tosca.relationships.BelongsToOne + - provider_service: + node: service#volt + relationship: tosca.relationships.BelongsToOne + + service_dependency#volt_fabric-crossconnect: + type: tosca.nodes.ServiceDependency + properties: + connect_method: none + requirements: + - subscriber_service: + node: service#volt + relationship: tosca.relationships.BelongsToOne + - provider_service: + node: service#fabric-crossconnect + relationship: tosca.relationships.BelongsToOne + + service_dependency#onos_fabric-crossconnect: + type: tosca.nodes.ServiceDependency + properties: + connect_method: none + requirements: + - subscriber_service: + node: service#fabric-crossconnect + relationship: tosca.relationships.BelongsToOne + - provider_service: + node: service#onos + relationship: tosca.relationships.BelongsToOne +{{- end -}} diff --git a/helm-charts/xos-profiles/seba-services/templates/tests/test-att-workflow.yaml b/helm-charts/xos-profiles/seba-services/templates/tests/test-att-workflow.yaml new file mode 100644 index 0000000..f029cf3 --- /dev/null +++ b/helm-charts/xos-profiles/seba-services/templates/tests/test-att-workflow.yaml @@ -0,0 +1,45 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Pod +metadata: + name: "{{ .Release.Name }}-api-test" + annotations: + "helm.sh/hook": test-success +spec: + restartPolicy: Never + containers: + - name: {{ .Release.Name }}-api-test + image: {{ .Values.global.registry }}{{ .Values.images.xos_api_tester.repository }}:{{ tpl .Values.images.xos_api_tester.tag . }} + imagePullPolicy: {{ .Values.images.xos_api_tester.pullPolicy }} + volumeMounts: + - name: log-volume + mountPath: /src/cord-api/Tests/Log/ + env: + - name: SERVER_IP + value: 'xos-chameleon' + - name: SERVER_PORT + value: '9101' + - name: XOS_USER + value: {{ .Values.xosAdminUser | quote }} + - name: XOS_PASSWD + value: {{ .Values.xosAdminPassword | quote}} + command: ["pybot", "-L", "TRACE", "-d", "Log", "-T", "WorkflowValidations/ATT_Workflow.robot"] + volumes: + - name: log-volume + hostPath: + path: /tmp/helm_test_attworkflow_logs_{{ dateInZone "20060102T030405.00Z" (now) "UTC" }} + type: DirectoryOrCreate diff --git a/helm-charts/xos-profiles/seba-services/templates/tosca-configmap.yaml b/helm-charts/xos-profiles/seba-services/templates/tosca-configmap.yaml new file mode 100644 index 0000000..3b78537 --- /dev/null +++ b/helm-charts/xos-profiles/seba-services/templates/tosca-configmap.yaml @@ -0,0 +1,35 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: seba-services-tosca +data: + 020-rcord-subscriber-service.yaml: | +{{ include "rcord.serviceTosca" .Values.rcord | indent 4 }} + 030-volt-service.yaml: | +{{ include "volt.serviceTosca" .Values.volt | indent 4 }} + 040-fabric-crossconnect-service.yaml: | +{{ include "fabric-crossconnect.serviceTosca" (index .Values "fabric-crossconnect") | indent 4 }} + 061-onos-service.yaml: | +{{ include "seba-services.onosTosca" .Values | indent 4 }} +{{- if .Values.fabric.enabled }} + 070-fabric-service.yaml: | +{{ include "fabric.serviceTosca" .Values.fabric | indent 4 }} +{{- end }} + 300-service-graph.yaml: | +{{ include "seba-services.serviceGraphTosca" . | indent 4 }} diff --git a/helm-charts/xos-profiles/seba-services/templates/tosca-job.yaml b/helm-charts/xos-profiles/seba-services/templates/tosca-job.yaml new file mode 100644 index 0000000..8317c08 --- /dev/null +++ b/helm-charts/xos-profiles/seba-services/templates/tosca-job.yaml @@ -0,0 +1,55 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: batch/v1 +kind: Job +metadata: + name: {{ template "seba-services.fullname" . }}-tosca-loader + labels: + app: {{ template "seba-services.name" . }} + chart: {{ template "seba-services.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + backoffLimit: 12 + template: + metadata: + labels: + app: {{ template "seba-services.name" . }} + release: {{ .Release.Name }} + annotations: + checksum/config: {{ include (print $.Template.BasePath "/tosca-configmap.yaml") . | sha256sum }} + spec: + restartPolicy: OnFailure + containers: + - name: {{ .Chart.Name }}-tosca-loader + image: {{ .Values.global.registry }}{{ .Values.images.tosca_loader.repository }}:{{ tpl .Values.images.tosca_loader.tag . }} + imagePullPolicy: {{ .Values.images.tosca_loader.pullPolicy }} + env: + - name: XOS_USER + value: {{ .Values.xosAdminUser }} + - name: XOS_PASSWD + valueFrom: + secretKeyRef: + name: xos-admin-passwd-secret + key: password + volumeMounts: + - name: seba-services-tosca + mountPath: /opt/tosca + volumes: + - name: seba-services-tosca + configMap: + name: seba-services-tosca diff --git a/helm-charts/xos-profiles/seba-services/values.yaml b/helm-charts/xos-profiles/seba-services/values.yaml new file mode 100644 index 0000000..fce29c4 --- /dev/null +++ b/helm-charts/xos-profiles/seba-services/values.yaml @@ -0,0 +1,62 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Default values for the seba-services profile. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +nameOverride: "" +fullnameOverride: "" + +images: + tosca_loader: + repository: 'xosproject/tosca-loader' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + + xos_api_tester: + repository: 'xosproject/xos-api-tester' + tag: 'master' + pullPolicy: 'Always' + +global: + registry: "" + +xosAdminUser: "admin@opencord.org" +xosAdminPassword: "letmein" + +# ONOS applications +sadisAppUrl: "https://oss.sonatype.org/service/local/repositories/releases/content/org/opencord/sadis-app/2.2.0/sadis-app-2.2.0.oar" +sadisAppVersion: "2.2.0" + +dhcpl2relayAppUrl: "https://oss.sonatype.org/service/local/repositories/releases/content/org/opencord/dhcpl2relay/1.5.0/dhcpl2relay-1.5.0.oar" +dhcpl2relayAppVersion: "1.5.0" + +oltAppUrl: "https://oss.sonatype.org/service/local/repositories/releases/content/org/opencord/olt-app/2.1.0/olt-app-2.1.0.oar" +oltAppVersion: "2.1.0" + +kafkaAppUrl: "https://oss.sonatype.org/service/local/repositories/releases/content/org/opencord/kafka/1.0.0/kafka-1.0.0.oar" +kafkaAppVersion: "1.0.0" + +onosRestService: "onos-ui.default.svc.cluster.local" +kafkaService: "cord-kafka.default.svc.cluster.local:9092" + +# whether to install or not this shared services +fabric: + enabled: true +onos-service: + enabled: true diff --git a/helm-charts/xos-services/addressmanager/.helmignore b/helm-charts/xos-services/addressmanager/.helmignore new file mode 100644 index 0000000..f0c1319 --- /dev/null +++ b/helm-charts/xos-services/addressmanager/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/helm-charts/xos-services/addressmanager/Chart.yaml b/helm-charts/xos-services/addressmanager/Chart.yaml new file mode 100644 index 0000000..dd00af2 --- /dev/null +++ b/helm-charts/xos-services/addressmanager/Chart.yaml @@ -0,0 +1,22 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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: addressmanager +description: A Helm chart for XOS's "addressmanager" service +icon: https://guide.opencord.org/logos/cord.svg + +version: 2.0.4 +appVersion: 2.0.4 + diff --git a/helm-charts/xos-services/addressmanager/templates/_helpers.tpl b/helm-charts/xos-services/addressmanager/templates/_helpers.tpl new file mode 100644 index 0000000..58767af --- /dev/null +++ b/helm-charts/xos-services/addressmanager/templates/_helpers.tpl @@ -0,0 +1,82 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{/* +Expand the name of the chart. +*/}} +{{- define "addressmanager.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "addressmanager.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "addressmanager.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- define "addressmanager.serviceConfig" -}} +name: addressmanager +accessor: + username: {{ .Values.xosAdminUser | quote }} + password: {{ .Values.xosAdminPassword | quote }} + endpoint: xos-core:50051 +required_models: + - AddressManagerServiceInstance +dependency_graph: "/opt/xos/synchronizers/addressmanager/model-deps" +model_policies_dir: "/opt/xos/synchronizers/addressmanager/model_policies" +models_dir: "/opt/xos/synchronizers/addressmanager/models" +logging: + version: 1 + handlers: + console: + class: logging.StreamHandler + file: + class: logging.handlers.RotatingFileHandler + filename: /var/log/xos.log + maxBytes: 10485760 + backupCount: 5 + kafka: + class: kafkaloghandler.KafkaLogHandler + bootstrap_servers: + - "cord-kafka:9092" + topic: xos.log.addressmanager + loggers: + '': + handlers: + - console + - file + - kafka + level: DEBUG +{{- end -}} diff --git a/helm-charts/xos-services/addressmanager/templates/configmap.yaml b/helm-charts/xos-services/addressmanager/templates/configmap.yaml new file mode 100644 index 0000000..185111b --- /dev/null +++ b/helm-charts/xos-services/addressmanager/templates/configmap.yaml @@ -0,0 +1,23 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: addressmanager +data: + serviceConfig: | +{{ include "addressmanager.serviceConfig" . | indent 4 }} diff --git a/helm-charts/xos-services/addressmanager/templates/deployment.yaml b/helm-charts/xos-services/addressmanager/templates/deployment.yaml new file mode 100644 index 0000000..61f1900 --- /dev/null +++ b/helm-charts/xos-services/addressmanager/templates/deployment.yaml @@ -0,0 +1,77 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: apps/v1beta2 +kind: Deployment +metadata: + name: {{ template "addressmanager.fullname" . }} + labels: + app: {{ template "addressmanager.name" . }} + chart: {{ template "addressmanager.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + app: {{ template "addressmanager.name" . }} + release: {{ .Release.Name }} + template: + metadata: + labels: + app: {{ template "addressmanager.name" . }} + release: {{ .Release.Name }} + annotations: + checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} + spec: + containers: + - name: {{ .Chart.Name }} + image: {{ .Values.global.registry }}{{ .Values.image.repository }}:{{ tpl .Values.image.tag . }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + resources: +{{ toYaml .Values.resources | indent 12 }} + volumeMounts: + - name: addressmanager-config + mountPath: /opt/xos/synchronizers/addressmanager/addressmanager_config.yaml + subPath: addressmanager_config.yaml + - name: certchain-volume + mountPath: /usr/local/share/ca-certificates/local_certs.crt + subPath: config/ca_cert_chain.pem + volumes: + - name: addressmanager-config + configMap: + name: addressmanager + items: + - key: serviceConfig + path: addressmanager_config.yaml + - name: certchain-volume + configMap: + name: ca-certificates + items: + - key: chain + path: config/ca_cert_chain.pem + {{- with .Values.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} diff --git a/helm-charts/xos-services/addressmanager/values.yaml b/helm-charts/xos-services/addressmanager/values.yaml new file mode 100644 index 0000000..cc9b4e6 --- /dev/null +++ b/helm-charts/xos-services/addressmanager/values.yaml @@ -0,0 +1,42 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Default values for addressmanager. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +nameOverride: "" +fullnameOverride: "" + +image: + repository: 'xosproject/addressmanager-synchronizer' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + +global: + registry: '' + +xosAdminUser: "admin@opencord.org" +xosAdminPassword: "letmein" + +resources: {} + +nodeSelector: {} + +tolerations: [] + +affinity: {} diff --git a/helm-charts/xos-services/att-workflow-driver/.helmignore b/helm-charts/xos-services/att-workflow-driver/.helmignore new file mode 100644 index 0000000..f0c1319 --- /dev/null +++ b/helm-charts/xos-services/att-workflow-driver/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/helm-charts/xos-services/att-workflow-driver/Chart.yaml b/helm-charts/xos-services/att-workflow-driver/Chart.yaml new file mode 100644 index 0000000..8028d96 --- /dev/null +++ b/helm-charts/xos-services/att-workflow-driver/Chart.yaml @@ -0,0 +1,21 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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: att-workflow-driver +description: A Helm chart for XOS's "att-workflow-driver" service +icon: https://guide.opencord.org/logos/cord.svg + +version: 1.1.0 +appVersion: 1.2.0 diff --git a/helm-charts/xos-services/att-workflow-driver/templates/_helpers.tpl b/helm-charts/xos-services/att-workflow-driver/templates/_helpers.tpl new file mode 100644 index 0000000..86daf56 --- /dev/null +++ b/helm-charts/xos-services/att-workflow-driver/templates/_helpers.tpl @@ -0,0 +1,80 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{/* +Expand the name of the chart. +*/}} +{{- define "att-workflow-driver.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "att-workflow-driver.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "att-workflow-driver.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- define "att-workflow-driver.serviceConfig" -}} +name: att-workflow-driver +accessor: + username: {{ .Values.xosAdminUser | quote }} + password: {{ .Values.xosAdminPassword | quote }} + endpoint: {{ .Values.xosCoreService | quote }} +event_bus: + endpoint: {{ .Values.kafkaService | quote }} + kind: kafka +logging: + version: 1 + handlers: + console: + class: logging.StreamHandler + file: + class: logging.handlers.RotatingFileHandler + filename: /var/log/xos.log + maxBytes: 10485760 + backupCount: 5 + kafka: + class: kafkaloghandler.KafkaLogHandler + bootstrap_servers: + - "{{ .Values.kafkaService }}:9092" + topic: xos.log.att-workflow-driver + loggers: + '': + handlers: + - console + - file + - kafka + level: DEBUG +{{- end -}} diff --git a/helm-charts/xos-services/att-workflow-driver/templates/_tosca.tpl b/helm-charts/xos-services/att-workflow-driver/templates/_tosca.tpl new file mode 100644 index 0000000..1e92a0c --- /dev/null +++ b/helm-charts/xos-services/att-workflow-driver/templates/_tosca.tpl @@ -0,0 +1,30 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{- define "att-workflow-driver.serviceTosca" -}} +tosca_definitions_version: tosca_simple_yaml_1_0 +description: Set up att-workflow-driver service +imports: + - custom_types/attworkflowdriverservice.yaml + +topology_template: + node_templates: + service#att-workflow-driver: + type: tosca.nodes.AttWorkflowDriverService + properties: + name: att-workflow-driver + kind: oss +{{- end -}} diff --git a/helm-charts/xos-services/att-workflow-driver/templates/configmap.yaml b/helm-charts/xos-services/att-workflow-driver/templates/configmap.yaml new file mode 100644 index 0000000..ce09cb5 --- /dev/null +++ b/helm-charts/xos-services/att-workflow-driver/templates/configmap.yaml @@ -0,0 +1,22 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: att-workflow-driver +data: + serviceConfig: | +{{ include "att-workflow-driver.serviceConfig" . | indent 4 }} diff --git a/helm-charts/xos-services/att-workflow-driver/templates/deployment.yaml b/helm-charts/xos-services/att-workflow-driver/templates/deployment.yaml new file mode 100644 index 0000000..2b7b439 --- /dev/null +++ b/helm-charts/xos-services/att-workflow-driver/templates/deployment.yaml @@ -0,0 +1,77 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: apps/v1beta2 +kind: Deployment +metadata: + name: {{ template "att-workflow-driver.fullname" . }} + labels: + app: {{ template "att-workflow-driver.name" . }} + chart: {{ template "att-workflow-driver.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + app: {{ template "att-workflow-driver.name" . }} + release: {{ .Release.Name }} + template: + metadata: + labels: + app: {{ template "att-workflow-driver.name" . }} + release: {{ .Release.Name }} + annotations: + checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} + spec: + containers: + - name: {{ .Chart.Name }} + image: {{ .Values.global.registry }}{{ .Values.image.repository }}:{{ tpl .Values.image.tag . }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + resources: +{{ toYaml .Values.resources | indent 12 }} + volumeMounts: + - name: att-workflow-driver-config + mountPath: /opt/xos/synchronizers/att-workflow-driver/mounted_config.yaml + subPath: mounted_config.yaml + - name: certchain-volume + mountPath: /usr/local/share/ca-certificates/local_certs.crt + subPath: config/ca_cert_chain.pem + volumes: + - name: att-workflow-driver-config + configMap: + name: att-workflow-driver + items: + - key: serviceConfig + path: mounted_config.yaml + - name: certchain-volume + configMap: + name: ca-certificates + items: + - key: chain + path: config/ca_cert_chain.pem + {{- with .Values.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} diff --git a/helm-charts/xos-services/att-workflow-driver/values.yaml b/helm-charts/xos-services/att-workflow-driver/values.yaml new file mode 100644 index 0000000..56b5516 --- /dev/null +++ b/helm-charts/xos-services/att-workflow-driver/values.yaml @@ -0,0 +1,45 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Default values for vOLT +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +nameOverride: "" +fullnameOverride: "" + +image: + repository: 'xosproject/att-workflow-driver-synchronizer' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + +global: + registry: '' + +xosAdminUser: "admin@opencord.org" +xosAdminPassword: "letmein" +xosCoreService: "xos-core:50051" + +kafkaService: "cord-kafka" + +resources: {} + +nodeSelector: {} + +tolerations: [] + +affinity: {} diff --git a/helm-charts/xos-services/epc-service/.helmignore b/helm-charts/xos-services/epc-service/.helmignore new file mode 100644 index 0000000..f0c1319 --- /dev/null +++ b/helm-charts/xos-services/epc-service/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/helm-charts/xos-services/epc-service/Chart.yaml b/helm-charts/xos-services/epc-service/Chart.yaml new file mode 100644 index 0000000..50fa834 --- /dev/null +++ b/helm-charts/xos-services/epc-service/Chart.yaml @@ -0,0 +1,21 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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: epc-service +description: A Helm chart for XOS's "epc-service" service +icon: https://guide.opencord.org/logos/cord.svg + +version: 1.1.3 +appVersion: 1.1.3 diff --git a/helm-charts/xos-services/epc-service/templates/_helpers.tpl b/helm-charts/xos-services/epc-service/templates/_helpers.tpl new file mode 100644 index 0000000..4d6d7d3 --- /dev/null +++ b/helm-charts/xos-services/epc-service/templates/_helpers.tpl @@ -0,0 +1,78 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{/* +Expand the name of the chart. +*/}} +{{- define "epc-service.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "epc-service.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "epc-service.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- define "epc-service.serviceConfig" -}} +name: vepc +accessor: + username: {{ .Values.xosAdminUser | quote }} + password: {{ .Values.xosAdminPassword | quote }} + endpoint: xos-core:50051 +logging: + version: 1 + handlers: + console: + class: logging.StreamHandler + file: + class: logging.handlers.RotatingFileHandler + filename: /var/log/xos.log + maxBytes: 10485760 + backupCount: 5 + kafka: + class: kafkaloghandler.KafkaLogHandler + bootstrap_servers: + - "cord-kafka:9092" + topic: xos.log.epc-service + loggers: + '': + handlers: + - console + - file + - kafka + level: DEBUG + +{{- end -}} diff --git a/helm-charts/xos-services/epc-service/templates/_tosca.tpl b/helm-charts/xos-services/epc-service/templates/_tosca.tpl new file mode 100644 index 0000000..bbef54b --- /dev/null +++ b/helm-charts/xos-services/epc-service/templates/_tosca.tpl @@ -0,0 +1,31 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{- define "epc-service.serviceTosca" -}} +tosca_definitions_version: tosca_simple_yaml_1_0 + +imports: + - custom_types/vepcservice.yaml + +description: Configures the VEPC service + +topology_template: + node_templates: + service#vepc: + type: tosca.nodes.VEPCService + properties: + name: vepc +{{- end -}} \ No newline at end of file diff --git a/helm-charts/xos-services/epc-service/templates/configmap.yaml b/helm-charts/xos-services/epc-service/templates/configmap.yaml new file mode 100644 index 0000000..c999b28 --- /dev/null +++ b/helm-charts/xos-services/epc-service/templates/configmap.yaml @@ -0,0 +1,23 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: epc-service +data: + serviceConfig: | +{{ include "epc-service.serviceConfig" . | indent 4 }} diff --git a/helm-charts/xos-services/epc-service/templates/deployment.yaml b/helm-charts/xos-services/epc-service/templates/deployment.yaml new file mode 100644 index 0000000..6b487ba --- /dev/null +++ b/helm-charts/xos-services/epc-service/templates/deployment.yaml @@ -0,0 +1,76 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: apps/v1beta2 +kind: Deployment +metadata: + name: {{ template "epc-service.fullname" . }} + labels: + app: {{ template "epc-service.name" . }} + chart: {{ template "epc-service.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + app: {{ template "epc-service.name" . }} + release: {{ .Release.Name }} + template: + metadata: + labels: + app: {{ template "epc-service.name" . }} + release: {{ .Release.Name }} + annotations: + checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} + spec: + containers: + - name: {{ .Chart.Name }} + image: {{ .Values.global.registry }}{{ .Values.image.repository }}:{{ tpl .Values.image.tag . }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + resources: +{{ toYaml .Values.resources | indent 12 }} + volumeMounts: + - name: epc-service-config + mountPath: /opt/xos/synchronizers/epc-service/mounted_config.yaml + subPath: mounted_config.yaml + - name: certchain-volume + mountPath: /usr/local/share/ca-certificates/local_certs.crt + subPath: config/ca_cert_chain.pem + volumes: + - name: epc-service-config + configMap: + name: epc-service + items: + - key: serviceConfig + path: mounted_config.yaml + - name: certchain-volume + configMap: + name: ca-certificates + items: + - key: chain + path: config/ca_cert_chain.pem + {{- with .Values.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} diff --git a/helm-charts/xos-services/epc-service/values.yaml b/helm-charts/xos-services/epc-service/values.yaml new file mode 100644 index 0000000..5788f24 --- /dev/null +++ b/helm-charts/xos-services/epc-service/values.yaml @@ -0,0 +1,42 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Default values for epc-service. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +nameOverride: "" +fullnameOverride: "" + +image: + repository: 'xosproject/vepc-synchronizer' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + +global: + registry: '' + +xosAdminUser: "admin@opencord.org" +xosAdminPassword: "letmein" + +resources: {} + +nodeSelector: {} + +tolerations: [] + +affinity: {} diff --git a/helm-charts/xos-services/exampleservice/.helmignore b/helm-charts/xos-services/exampleservice/.helmignore new file mode 100644 index 0000000..f0c1319 --- /dev/null +++ b/helm-charts/xos-services/exampleservice/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/helm-charts/xos-services/exampleservice/Chart.yaml b/helm-charts/xos-services/exampleservice/Chart.yaml new file mode 100644 index 0000000..1414ace --- /dev/null +++ b/helm-charts/xos-services/exampleservice/Chart.yaml @@ -0,0 +1,22 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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: exampleservice +description: A Helm chart for XOS's "exampleservice" service +icon: https://guide.opencord.org/logos/cord.svg + +version: 2.2.4 +appVersion: 2.2.4 + diff --git a/helm-charts/xos-services/exampleservice/files/id_rsa b/helm-charts/xos-services/exampleservice/files/id_rsa new file mode 100644 index 0000000..c840002 --- /dev/null +++ b/helm-charts/xos-services/exampleservice/files/id_rsa @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpgIBAAKCAQEAy+S+bw7ENW5knorMTH/xmRKr/OaBx7ukRRNe1WKEwLgQbB0J +xEznHG0E/OakgcuTQDACArTndeYl2H5rpdHhXkh6EK9R9yAF09In+gDcVzpvP2dq +5UTbYThILIw0FPX6DcUOMJLMoMuXqSpmxITKmxWY7o+M2H0rT8xP4JBUhPUI4SjF +miZsixX6vX/A5wvk0xONSuYhm7a2pq+6h0lrCisu+V1ejGWSyxRMa0KpWA5SwNld +GmHswqpd3wfeiiZn+hiUU9492O6Fmo+4BMzAsnANkID/GTRS/9kNaoL0EXOiOOvx +1IjodyE/C1Q3aNmVJ/aqzWpnkNc0e2vsAb2CFQIDAQABAoIBAQDGRZByCtf+ZXVv +PuXgVmKoSiH5cmYtxmi9y1JjCsSxa8x8ddhzjZ0IZXN+QwMiPMbamlS6MRUL71xK +JNWlkG0p9CzPYM3CFN/V1f2N/ZxHLsnTzEuE2+rBpat5tnVHFNOu5DsiPP7ENncq +x9Lbs44aNWxcQDfkpgOiO7pJU9D84FYuJbH6EhHCt1nuyUeHaG7qqsDYnaGo6NSc +qqnmrvoSBOQ+CIXgqRwGuetN9kNF/nKOWxWiZ+VAYIXb7cnkmOWTg5ojPifCWMeE +xiV9agFzEEJhPxhivFtIq0XvsiSlAZvZcREXKayw6zFx9JTgpOXYln+xg0pQEVXr +MLWv7BTZAoGBAPLy1Z7qjeR9PwTZen970AS3BsATQAcAh4aEHGPxwLmWDkhzJTW7 +C2U4dSyjB1W6OL6y4u7aggO5nshsEUZ73hE37b1/sr1PYC+NXuXuThDYDFD3f5LA +HwU0Xvx+uibV75+XpOkClSBkf2k6eBFD68PaLyjfCSnEkzukWPtngxRTAoGBANbY +zXFKIrcQtAz2p3+txU9Xqa5xK2rQfLurc66xxxC3KO8oMhYP2htieYRygwg91JR2 +Bu6sX8+t5MNYSso1t8CSO36tcgUDowo+2XuvY9FwQUgViHNKOb7cFrNSgWMVhbng +/ZgxKrnVl1NPBivDV5kPg+jD1BIOUlQimyrD6sL3AoGBAOnnRCZpWs1GjHrly5ub +n846TMR2hCl5qAGphg/vfIbxYrT8LzII8FK2xZGBMJmn3eQ0JGqkc5KUjrwV15gN +v+LB/yF4JaVAG7IMoPYstnpfF5SIhQnL8NG4906P0Dd9t+PmQz6XXu4987FjOqAc +zYvVr5vhCFhvSvWcKJN7uGbDAoGBAKvJequlLZDXCEB9UHzkwymn3IMg9ihYQAQH +GV6Lw7H34gEoULQXRLw0xxlCPsduOPXkUbKxnYJ/drVDebmprh2KT4wAv3SG7eyZ +SGh/Wv7yFSDAJvSYWwfjDzufMtm5Mc3oupzgY1toD7GLNFH1xasbHswVGRK+5NFl +QlC1ipcNAoGBAIxqGyCai6btwDlbpkdI+ck2j7k9ndZ8sosc0G2se9d58sfsHdWe +1wpqe62t7mQZr+IgEyq7RuuEtRR6Xqb8RQqAuEdSms1zcWc30SJJhPiwxIeLL0dx +ly/HBBqnozD4BN3ENiqnIhOgeZE7XHaS43luYkYpBOuBaWYs5IIZWcct +-----END RSA PRIVATE KEY----- diff --git a/helm-charts/xos-services/exampleservice/templates/_helpers.tpl b/helm-charts/xos-services/exampleservice/templates/_helpers.tpl new file mode 100644 index 0000000..6b1a62f --- /dev/null +++ b/helm-charts/xos-services/exampleservice/templates/_helpers.tpl @@ -0,0 +1,76 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{/* +Expand the name of the chart. +*/}} +{{- define "exampleservice.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "exampleservice.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "exampleservice.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- define "exampleservice.serviceConfig" -}} +name: exampleservice +accessor: + username: {{ .Values.xosAdminUser | quote }} + password: {{ .Values.xosAdminPassword | quote }} + endpoint: xos-core:50051 +logging: + version: 1 + handlers: + console: + class: logging.StreamHandler + file: + class: logging.handlers.RotatingFileHandler + filename: /var/log/xos.log + maxBytes: 10485760 + backupCount: 5 + kafka: + class: kafkaloghandler.KafkaLogHandler + bootstrap_servers: + - "cord-kafka:9092" + topic: xos.log.exampleservice + loggers: + '': + handlers: + - console + - file + - kafka + level: DEBUG +proxy_ssh: + enabled: {{ .Values.global.proxySshEnabled }} + user: {{ .Values.global.proxySshUser }} +{{- end -}} diff --git a/helm-charts/xos-services/exampleservice/templates/_tosca.tpl b/helm-charts/xos-services/exampleservice/templates/_tosca.tpl new file mode 100644 index 0000000..0c485d8 --- /dev/null +++ b/helm-charts/xos-services/exampleservice/templates/_tosca.tpl @@ -0,0 +1,180 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{- define "exampleservice.serviceTosca" -}} +tosca_definitions_version: tosca_simple_yaml_1_0 + +imports: + - custom_types/slice.yaml + - custom_types/site.yaml + - custom_types/image.yaml + - custom_types/flavor.yaml + - custom_types/network.yaml + - custom_types/networktemplate.yaml + - custom_types/networkslice.yaml + - custom_types/openstackservice.yaml + - custom_types/trustdomain.yaml + - custom_types/exampleservice.yaml + - custom_types/exampleserviceinstance.yaml + +description: configure exampleservice + +topology_template: + node_templates: + service#openstack: + type: tosca.nodes.OpenStackService + properties: + name: "OpenStack" + must-exist: true + + untrusted_trustdomain: + type: tosca.nodes.TrustDomain + properties: + name: "untrusted-openstack" + requirements: + - owner: + node: service#openstack + relationship: tosca.relationships.BelongsToOne + +# site, image, fully created in deployment.yaml + mysite: + type: tosca.nodes.Site + properties: + must-exist: true + name: {{ .cordSiteName }} + + m1.small: + type: tosca.nodes.Flavor + properties: + name: m1.small + must-exist: true + + trusty-server-multi-nic: + type: tosca.nodes.Image + properties: + name: "trusty-server-multi-nic" + container_format: "BARE" + disk_format: "QCOW2" + path: "https://github.com/opencord/platform-install/releases/download/vms/trusty-server-cloudimg-amd64-disk1.img.20170201" + +# private network template, fully created somewhere else + private: + type: tosca.nodes.NetworkTemplate + properties: + must-exist: true + name: Private + +# management networks, fully created in management-net.yaml + management_network: + type: tosca.nodes.Network + properties: + must-exist: true + name: management + +# public network, fully created somewhere else + public_network: + type: tosca.nodes.Network + properties: + must-exist: true + name: public + + exampleservice_network: + type: tosca.nodes.Network + properties: + name: exampleservice_network + labels: exampleservice_private_network + requirements: + - template: + node: private + relationship: tosca.relationships.BelongsToOne + - owner: + node: exampleservice_slice + relationship: tosca.relationships.BelongsToOne + +# ExampleService Slices + exampleservice_slice: + description: Example Service Slice + type: tosca.nodes.Slice + properties: + name: exampleservice + default_isolation: vm + network: noauto + requirements: + - site: + node: mysite + relationship: tosca.relationships.BelongsToOne + - service: + node: exampleservice + relationship: tosca.relationships.BelongsToOne + - default_image: + node: trusty-server-multi-nic + relationship: tosca.relationships.BelongsToOne + - default_flavor: + node: m1.small + relationship: tosca.relationships.BelongsToOne + - trust_domain: + node: untrusted_trustdomain + relationship: tosca.relationships.BelongsToOne + +# ExampleService NetworkSlices + exampleservice_slice_management_network: + type: tosca.nodes.NetworkSlice + requirements: + - network: + node: management_network + relationship: tosca.relationships.BelongsToOne + - slice: + node: exampleservice_slice + relationship: tosca.relationships.BelongsToOne + + exampleservice_slice_public_network: + type: tosca.nodes.NetworkSlice + requirements: + - network: + node: public_network + relationship: tosca.relationships.BelongsToOne + - slice: + node: exampleservice_slice + relationship: tosca.relationships.BelongsToOne + + exampleservice_slice_exampleservice_network: + type: tosca.nodes.NetworkSlice + requirements: + - network: + node: exampleservice_network + relationship: tosca.relationships.BelongsToOne + - slice: + node: exampleservice_slice + relationship: tosca.relationships.BelongsToOne + + exampleservice: + type: tosca.nodes.ExampleService + properties: + name: exampleservice + public_key: {{ .publicKey | quote }} + private_key_fn: /opt/xos/services/exampleservice/keys/id_rsa + service_message: hello + + exampletenant1: + type: tosca.nodes.ExampleServiceInstance + properties: + name: exampletenant1 + tenant_message: world + requirements: + - owner: + node: exampleservice + relationship: tosca.relationships.BelongsToOne +{{- end -}} diff --git a/helm-charts/xos-services/exampleservice/templates/configmap.yaml b/helm-charts/xos-services/exampleservice/templates/configmap.yaml new file mode 100644 index 0000000..84c030d --- /dev/null +++ b/helm-charts/xos-services/exampleservice/templates/configmap.yaml @@ -0,0 +1,23 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: exampleservice +data: + serviceConfig: | +{{ include "exampleservice.serviceConfig" . | indent 4 }} diff --git a/helm-charts/xos-services/exampleservice/templates/deployment.yaml b/helm-charts/xos-services/exampleservice/templates/deployment.yaml new file mode 100644 index 0000000..8a42d38 --- /dev/null +++ b/helm-charts/xos-services/exampleservice/templates/deployment.yaml @@ -0,0 +1,88 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: apps/v1beta2 +kind: Deployment +metadata: + name: {{ template "exampleservice.fullname" . }} + labels: + app: {{ template "exampleservice.name" . }} + chart: {{ template "exampleservice.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + app: {{ template "exampleservice.name" . }} + release: {{ .Release.Name }} + template: + metadata: + labels: + app: {{ template "exampleservice.name" . }} + release: {{ .Release.Name }} + spec: + containers: + - name: {{ .Chart.Name }} + image: {{ .Values.global.registry }}{{ .Values.image.repository }}:{{ tpl .Values.image.tag . }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + resources: +{{ toYaml .Values.resources | indent 12 }} + volumeMounts: + - name: exampleservice-config + mountPath: /opt/xos/synchronizers/exampleservice/mounted_config.yaml + subPath: mounted_config.yaml + - name: certchain-volume + mountPath: /usr/local/share/ca-certificates/local_certs.crt + subPath: config/ca_cert_chain.pem + - name: exampleservice-keys + mountPath: /opt/xos/services/exampleservice/keys + readOnly: true + - name: node-key + mountPath: /opt/cord_profile + readOnly: true + volumes: + - name: exampleservice-config + configMap: + name: exampleservice + items: + - key: serviceConfig + path: mounted_config.yaml + - name: certchain-volume + configMap: + name: ca-certificates + items: + - key: chain + path: config/ca_cert_chain.pem + - name: exampleservice-keys + secret: + secretName: exampleservice-keys + - name: node-key + secret: + secretName: node-key + defaultMode: 256 + optional: true + {{- with .Values.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} diff --git a/helm-charts/xos-services/exampleservice/templates/secret.yaml b/helm-charts/xos-services/exampleservice/templates/secret.yaml new file mode 100644 index 0000000..9ffe719 --- /dev/null +++ b/helm-charts/xos-services/exampleservice/templates/secret.yaml @@ -0,0 +1,23 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Secret +metadata: + name: exampleservice-keys + namespace: default +type: Opaque +data: + id_rsa: {{ .Files.Get .Values.privateKeyFile | b64enc }} \ No newline at end of file diff --git a/helm-charts/xos-services/exampleservice/values.yaml b/helm-charts/xos-services/exampleservice/values.yaml new file mode 100644 index 0000000..6fea766 --- /dev/null +++ b/helm-charts/xos-services/exampleservice/values.yaml @@ -0,0 +1,50 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Default values for exampleservice. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +nameOverride: "" +fullnameOverride: "" + +image: + repository: "xosproject/exampleservice-synchronizer" + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + +xosAdminUser: "admin@opencord.org" +xosAdminPassword: "letmein" + +cordSiteName: "mysite" + +resources: {} + +nodeSelector: {} + +tolerations: [] + +affinity: {} + +publicKey: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDL5L5vDsQ1bmSeisxMf/GZEqv85oHHu6RFE17VYoTAuBBsHQnETOccbQT85qSBy5NAMAICtOd15iXYfmul0eFeSHoQr1H3IAXT0if6ANxXOm8/Z2rlRNthOEgsjDQU9foNxQ4wksygy5epKmbEhMqbFZjuj4zYfStPzE/gkFSE9QjhKMWaJmyLFfq9f8DnC+TTE41K5iGbtramr7qHSWsKKy75XV6MZZLLFExrQqlYDlLA2V0aYezCql3fB96KJmf6GJRT3j3Y7oWaj7gEzMCycA2QgP8ZNFL/2Q1qgvQRc6I46/HUiOh3IT8LVDdo2ZUn9qrNameQ1zR7a+wBvYIV Insecure M-CORD keypair" +privateKeyFile: "files/id_rsa" + +# These variables can be overridden by the profile chart +global: + proxySshEnabled: true + proxySshUser: "root" + registry: '' diff --git a/helm-charts/xos-services/fabric-crossconnect/Chart.yaml b/helm-charts/xos-services/fabric-crossconnect/Chart.yaml new file mode 100644 index 0000000..0b26d73 --- /dev/null +++ b/helm-charts/xos-services/fabric-crossconnect/Chart.yaml @@ -0,0 +1,21 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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: fabric-crossconnect +description: A Helm chart for XOS's "fabric-crossconnect" service +icon: https://guide.opencord.org/logos/cord.svg + +version: 1.2.0 +appVersion: 1.2.1 diff --git a/helm-charts/xos-services/fabric-crossconnect/templates/_helpers.tpl b/helm-charts/xos-services/fabric-crossconnect/templates/_helpers.tpl new file mode 100644 index 0000000..53aae13 --- /dev/null +++ b/helm-charts/xos-services/fabric-crossconnect/templates/_helpers.tpl @@ -0,0 +1,80 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{/* +Expand the name of the chart. +*/}} +{{- define "fabric-crossconnect.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "fabric-crossconnect.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "fabric-crossconnect.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- define "fabric-crossconnect.serviceConfig" -}} +name: fabric-crossconnect +accessor: + username: {{ .Values.xosAdminUser | quote }} + password: {{ .Values.xosAdminPassword | quote }} + endpoint: {{ .Values.xosCoreService | quote }} +event_bus: + endpoint: {{ .Values.kafkaService | quote }} + kind: kafka +logging: + version: 1 + handlers: + console: + class: logging.StreamHandler + file: + class: logging.handlers.RotatingFileHandler + filename: /var/log/xos.log + maxBytes: 10485760 + backupCount: 5 + kafka: + class: kafkaloghandler.KafkaLogHandler + bootstrap_servers: + - "{{ .Values.kafkaService }}:9092" + topic: xos.log.fabric-crossconnect + loggers: + '': + handlers: + - console + - file + - kafka + level: DEBUG +{{- end -}} diff --git a/helm-charts/xos-services/fabric-crossconnect/templates/_tosca.tpl b/helm-charts/xos-services/fabric-crossconnect/templates/_tosca.tpl new file mode 100644 index 0000000..fcb3fd6 --- /dev/null +++ b/helm-charts/xos-services/fabric-crossconnect/templates/_tosca.tpl @@ -0,0 +1,30 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{- define "fabric-crossconnect.serviceTosca" -}} +tosca_definitions_version: tosca_simple_yaml_1_0 +description: Set up fabric-crossconnect service +imports: + - custom_types/fabriccrossconnectservice.yaml + +topology_template: + node_templates: + service#fabric-crossconnect: + type: tosca.nodes.FabricCrossconnectService + properties: + name: fabric-crossconnect + kind: data +{{- end -}} diff --git a/helm-charts/xos-services/fabric-crossconnect/templates/configmap.yaml b/helm-charts/xos-services/fabric-crossconnect/templates/configmap.yaml new file mode 100644 index 0000000..bc030b1 --- /dev/null +++ b/helm-charts/xos-services/fabric-crossconnect/templates/configmap.yaml @@ -0,0 +1,22 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: fabric-crossconnect +data: + serviceConfig: | +{{ include "fabric-crossconnect.serviceConfig" . | indent 4 }} diff --git a/helm-charts/xos-services/fabric-crossconnect/templates/deployment.yaml b/helm-charts/xos-services/fabric-crossconnect/templates/deployment.yaml new file mode 100644 index 0000000..9017f21 --- /dev/null +++ b/helm-charts/xos-services/fabric-crossconnect/templates/deployment.yaml @@ -0,0 +1,76 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: apps/v1beta2 +kind: Deployment +metadata: + name: {{ template "fabric-crossconnect.fullname" . }} + labels: + app: {{ template "fabric-crossconnect.name" . }} + chart: {{ template "fabric-crossconnect.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + app: {{ template "fabric-crossconnect.name" . }} + release: {{ .Release.Name }} + template: + metadata: + labels: + app: {{ template "fabric-crossconnect.name" . }} + release: {{ .Release.Name }} + annotations: + checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} + spec: + containers: + - name: {{ .Chart.Name }} + image: {{ .Values.global.registry }}{{ .Values.image.repository }}:{{ tpl .Values.image.tag . }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + resources: +{{ toYaml .Values.resources | indent 12 }} + volumeMounts: + - name: fabric-crossconnect-config + mountPath: /opt/xos/synchronizers/fabric-crossconnect/mounted_config.yaml + subPath: mounted_config.yaml + - name: certchain-volume + mountPath: /usr/local/share/ca-certificates/local_certs.crt + subPath: config/ca_cert_chain.pem + volumes: + - name: fabric-crossconnect-config + configMap: + name: fabric-crossconnect + items: + - key: serviceConfig + path: mounted_config.yaml + - name: certchain-volume + configMap: + name: ca-certificates + items: + - key: chain + path: config/ca_cert_chain.pem + {{- with .Values.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} diff --git a/helm-charts/xos-services/fabric-crossconnect/values.yaml b/helm-charts/xos-services/fabric-crossconnect/values.yaml new file mode 100644 index 0000000..3e441b6 --- /dev/null +++ b/helm-charts/xos-services/fabric-crossconnect/values.yaml @@ -0,0 +1,45 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Default values for fabric-crossconnect +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +nameOverride: "" +fullnameOverride: "" + +image: + repository: 'xosproject/fabric-crossconnect-synchronizer' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + +global: + registry: '' + +xosAdminUser: "admin@opencord.org" +xosAdminPassword: "letmein" +xosCoreService: "xos-core:50051" + +kafkaService: "cord-kafka" + +resources: {} + +nodeSelector: {} + +tolerations: [] + +affinity: {} diff --git a/helm-charts/xos-services/fabric/.helmignore b/helm-charts/xos-services/fabric/.helmignore new file mode 100644 index 0000000..f0c1319 --- /dev/null +++ b/helm-charts/xos-services/fabric/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/helm-charts/xos-services/fabric/Chart.yaml b/helm-charts/xos-services/fabric/Chart.yaml new file mode 100644 index 0000000..ec40e8b --- /dev/null +++ b/helm-charts/xos-services/fabric/Chart.yaml @@ -0,0 +1,21 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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: fabric +description: A Helm chart for XOS's "fabric" service +icon: https://guide.opencord.org/logos/cord.svg + +version: 2.2.0 +appVersion: 2.2.1 diff --git a/helm-charts/xos-services/fabric/templates/_helpers.tpl b/helm-charts/xos-services/fabric/templates/_helpers.tpl new file mode 100644 index 0000000..747aa6f --- /dev/null +++ b/helm-charts/xos-services/fabric/templates/_helpers.tpl @@ -0,0 +1,80 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{/* +Expand the name of the chart. +*/}} +{{- define "fabric.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "fabric.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "fabric.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- define "fabric.serviceConfig" -}} +name: fabric +accessor: + username: {{ .Values.xosAdminUser | quote }} + password: {{ .Values.xosAdminPassword | quote }} + endpoint: {{ .Values.xosCoreService | quote }} +event_bus: + endpoint: {{ .Values.kafkaService | quote }} + kind: kafka +logging: + version: 1 + handlers: + console: + class: logging.StreamHandler + file: + class: logging.handlers.RotatingFileHandler + filename: /var/log/xos.log + maxBytes: 10485760 + backupCount: 5 + kafka: + class: kafkaloghandler.KafkaLogHandler + bootstrap_servers: + - "{{ .Values.kafkaService }}:9092" + topic: xos.log.fabric + loggers: + '': + handlers: + - console + - file + - kafka + level: DEBUG +{{- end -}} diff --git a/helm-charts/xos-services/fabric/templates/_tosca.tpl b/helm-charts/xos-services/fabric/templates/_tosca.tpl new file mode 100644 index 0000000..8a5e466 --- /dev/null +++ b/helm-charts/xos-services/fabric/templates/_tosca.tpl @@ -0,0 +1,30 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{- define "fabric.serviceTosca" -}} +tosca_definitions_version: tosca_simple_yaml_1_0 +description: Set up Fabric service +imports: + - custom_types/fabricservice.yaml + +topology_template: + node_templates: + service#fabric: + type: tosca.nodes.FabricService + properties: + name: fabric + kind: data +{{- end -}} diff --git a/helm-charts/xos-services/fabric/templates/configmap.yaml b/helm-charts/xos-services/fabric/templates/configmap.yaml new file mode 100644 index 0000000..f0299d8 --- /dev/null +++ b/helm-charts/xos-services/fabric/templates/configmap.yaml @@ -0,0 +1,22 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: fabric +data: + serviceConfig: | +{{ include "fabric.serviceConfig" . | indent 4 }} diff --git a/helm-charts/xos-services/fabric/templates/deployment.yaml b/helm-charts/xos-services/fabric/templates/deployment.yaml new file mode 100644 index 0000000..6c666b8 --- /dev/null +++ b/helm-charts/xos-services/fabric/templates/deployment.yaml @@ -0,0 +1,77 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: apps/v1beta2 +kind: Deployment +metadata: + name: {{ template "fabric.fullname" . }} + labels: + app: {{ template "fabric.name" . }} + chart: {{ template "fabric.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + app: {{ template "fabric.name" . }} + release: {{ .Release.Name }} + template: + metadata: + labels: + app: {{ template "fabric.name" . }} + release: {{ .Release.Name }} + annotations: + checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} + spec: + containers: + - name: {{ .Chart.Name }} + image: {{ .Values.global.registry }}{{ .Values.image.repository }}:{{ tpl .Values.image.tag . }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + resources: +{{ toYaml .Values.resources | indent 12 }} + volumeMounts: + - name: fabric-config + mountPath: /opt/xos/synchronizers/fabric/mounted_config.yaml + subPath: mounted_config.yaml + - name: certchain-volume + mountPath: /usr/local/share/ca-certificates/local_certs.crt + subPath: config/ca_cert_chain.pem + volumes: + - name: fabric-config + configMap: + name: fabric + items: + - key: serviceConfig + path: mounted_config.yaml + - name: certchain-volume + configMap: + name: ca-certificates + items: + - key: chain + path: config/ca_cert_chain.pem + {{- with .Values.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} diff --git a/helm-charts/xos-services/fabric/values.yaml b/helm-charts/xos-services/fabric/values.yaml new file mode 100644 index 0000000..0a17c87 --- /dev/null +++ b/helm-charts/xos-services/fabric/values.yaml @@ -0,0 +1,45 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Default values for fabric service. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +nameOverride: "" +fullnameOverride: "" + +image: + repository: xosproject/fabric-synchronizer + tag: "{{ .Chart.AppVersion }}" + pullPolicy: Always + +global: + registry: "" + +xosAdminUser: "admin@opencord.org" +xosAdminPassword: "letmein" +xosCoreService: "xos-core:50051" + +kafkaService: "cord-kafka" + +resources: {} + +nodeSelector: {} + +tolerations: [] + +affinity: {} diff --git a/helm-charts/xos-services/hippie-oss/.helmignore b/helm-charts/xos-services/hippie-oss/.helmignore new file mode 100644 index 0000000..f0c1319 --- /dev/null +++ b/helm-charts/xos-services/hippie-oss/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/helm-charts/xos-services/hippie-oss/Chart.yaml b/helm-charts/xos-services/hippie-oss/Chart.yaml new file mode 100644 index 0000000..67cb52b --- /dev/null +++ b/helm-charts/xos-services/hippie-oss/Chart.yaml @@ -0,0 +1,21 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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: hippie-oss +description: A Helm chart for XOS's "hippie-oss" service +icon: https://guide.opencord.org/logos/cord.svg + +version: 1.1.3 +appVersion: 1.1.3 diff --git a/helm-charts/xos-services/hippie-oss/templates/_helpers.tpl b/helm-charts/xos-services/hippie-oss/templates/_helpers.tpl new file mode 100644 index 0000000..cfb8eda --- /dev/null +++ b/helm-charts/xos-services/hippie-oss/templates/_helpers.tpl @@ -0,0 +1,80 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{/* +Expand the name of the chart. +*/}} +{{- define "hippie-oss.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "hippie-oss.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "hippie-oss.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- define "hippie-oss.serviceConfig" -}} +name: hippie-oss +accessor: + username: {{ .Values.xosAdminUser | quote }} + password: {{ .Values.xosAdminPassword | quote }} + endpoint: xos-core:50051 +event_bus: + endpoint: {{ .Values.kafkaService | quote }} + kind: kafka +logging: + version: 1 + handlers: + console: + class: logging.StreamHandler + file: + class: logging.handlers.RotatingFileHandler + filename: /var/log/xos.log + maxBytes: 10485760 + backupCount: 5 + kafka: + class: kafkaloghandler.KafkaLogHandler + bootstrap_servers: + - "cord-kafka:9092" + topic: xos.log.hippie-oss + loggers: + '': + handlers: + - console + - file + - kafka + level: DEBUG +{{- end -}} diff --git a/helm-charts/xos-services/hippie-oss/templates/_tosca.tpl b/helm-charts/xos-services/hippie-oss/templates/_tosca.tpl new file mode 100644 index 0000000..675bcc9 --- /dev/null +++ b/helm-charts/xos-services/hippie-oss/templates/_tosca.tpl @@ -0,0 +1,30 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{- define "hippie-oss.serviceTosca" -}} +tosca_definitions_version: tosca_simple_yaml_1_0 +description: Set up hippie-oss service +imports: + - custom_types/hippieossservice.yaml + +topology_template: + node_templates: + service#hippie-oss: + type: tosca.nodes.HippieOSSService + properties: + name: hippie-oss + kind: oss +{{- end -}} diff --git a/helm-charts/xos-services/hippie-oss/templates/configmap.yaml b/helm-charts/xos-services/hippie-oss/templates/configmap.yaml new file mode 100644 index 0000000..492fcae --- /dev/null +++ b/helm-charts/xos-services/hippie-oss/templates/configmap.yaml @@ -0,0 +1,22 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: hippie-oss +data: + serviceConfig: | +{{ include "hippie-oss.serviceConfig" . | indent 4 }} diff --git a/helm-charts/xos-services/hippie-oss/templates/deployment.yaml b/helm-charts/xos-services/hippie-oss/templates/deployment.yaml new file mode 100644 index 0000000..ed3d534 --- /dev/null +++ b/helm-charts/xos-services/hippie-oss/templates/deployment.yaml @@ -0,0 +1,77 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: apps/v1beta2 +kind: Deployment +metadata: + name: {{ template "hippie-oss.fullname" . }} + labels: + app: {{ template "hippie-oss.name" . }} + chart: {{ template "hippie-oss.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + app: {{ template "hippie-oss.name" . }} + release: {{ .Release.Name }} + template: + metadata: + labels: + app: {{ template "hippie-oss.name" . }} + release: {{ .Release.Name }} + annotations: + checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} + spec: + containers: + - name: {{ .Chart.Name }} + image: {{ .Values.global.registry }}{{ .Values.image.repository }}:{{ tpl .Values.image.tag . }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + resources: +{{ toYaml .Values.resources | indent 12 }} + volumeMounts: + - name: hippie-oss-config + mountPath: /opt/xos/synchronizers/hippie-oss/mounted_config.yaml + subPath: mounted_config.yaml + - name: certchain-volume + mountPath: /usr/local/share/ca-certificates/local_certs.crt + subPath: config/ca_cert_chain.pem + volumes: + - name: hippie-oss-config + configMap: + name: hippie-oss + items: + - key: serviceConfig + path: mounted_config.yaml + - name: certchain-volume + configMap: + name: ca-certificates + items: + - key: chain + path: config/ca_cert_chain.pem + {{- with .Values.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} diff --git a/helm-charts/xos-services/hippie-oss/values.yaml b/helm-charts/xos-services/hippie-oss/values.yaml new file mode 100644 index 0000000..46f89c6 --- /dev/null +++ b/helm-charts/xos-services/hippie-oss/values.yaml @@ -0,0 +1,44 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Default values for vOLT +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +nameOverride: "" +fullnameOverride: "" + +image: + repository: 'xosproject/hippie-oss-synchronizer' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + +global: + registry: '' + +xosAdminUser: "admin@opencord.org" +xosAdminPassword: "letmein" + +kafkaService: "cord-kafka" + +resources: {} + +nodeSelector: {} + +tolerations: [] + +affinity: {} diff --git a/helm-charts/xos-services/hssdb/.helmignore b/helm-charts/xos-services/hssdb/.helmignore new file mode 100644 index 0000000..f0c1319 --- /dev/null +++ b/helm-charts/xos-services/hssdb/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/helm-charts/xos-services/hssdb/Chart.yaml b/helm-charts/xos-services/hssdb/Chart.yaml new file mode 100644 index 0000000..e1b959d --- /dev/null +++ b/helm-charts/xos-services/hssdb/Chart.yaml @@ -0,0 +1,22 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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: hssdb +description: A Helm chart for XOS's "hssdb" service +icon: https://guide.opencord.org/logos/cord.svg + +version: 1.0.2 +appVersion: 1.0.2 + diff --git a/helm-charts/xos-services/hssdb/files/id_rsa b/helm-charts/xos-services/hssdb/files/id_rsa new file mode 100644 index 0000000..c840002 --- /dev/null +++ b/helm-charts/xos-services/hssdb/files/id_rsa @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpgIBAAKCAQEAy+S+bw7ENW5knorMTH/xmRKr/OaBx7ukRRNe1WKEwLgQbB0J +xEznHG0E/OakgcuTQDACArTndeYl2H5rpdHhXkh6EK9R9yAF09In+gDcVzpvP2dq +5UTbYThILIw0FPX6DcUOMJLMoMuXqSpmxITKmxWY7o+M2H0rT8xP4JBUhPUI4SjF +miZsixX6vX/A5wvk0xONSuYhm7a2pq+6h0lrCisu+V1ejGWSyxRMa0KpWA5SwNld +GmHswqpd3wfeiiZn+hiUU9492O6Fmo+4BMzAsnANkID/GTRS/9kNaoL0EXOiOOvx +1IjodyE/C1Q3aNmVJ/aqzWpnkNc0e2vsAb2CFQIDAQABAoIBAQDGRZByCtf+ZXVv +PuXgVmKoSiH5cmYtxmi9y1JjCsSxa8x8ddhzjZ0IZXN+QwMiPMbamlS6MRUL71xK +JNWlkG0p9CzPYM3CFN/V1f2N/ZxHLsnTzEuE2+rBpat5tnVHFNOu5DsiPP7ENncq +x9Lbs44aNWxcQDfkpgOiO7pJU9D84FYuJbH6EhHCt1nuyUeHaG7qqsDYnaGo6NSc +qqnmrvoSBOQ+CIXgqRwGuetN9kNF/nKOWxWiZ+VAYIXb7cnkmOWTg5ojPifCWMeE +xiV9agFzEEJhPxhivFtIq0XvsiSlAZvZcREXKayw6zFx9JTgpOXYln+xg0pQEVXr +MLWv7BTZAoGBAPLy1Z7qjeR9PwTZen970AS3BsATQAcAh4aEHGPxwLmWDkhzJTW7 +C2U4dSyjB1W6OL6y4u7aggO5nshsEUZ73hE37b1/sr1PYC+NXuXuThDYDFD3f5LA +HwU0Xvx+uibV75+XpOkClSBkf2k6eBFD68PaLyjfCSnEkzukWPtngxRTAoGBANbY +zXFKIrcQtAz2p3+txU9Xqa5xK2rQfLurc66xxxC3KO8oMhYP2htieYRygwg91JR2 +Bu6sX8+t5MNYSso1t8CSO36tcgUDowo+2XuvY9FwQUgViHNKOb7cFrNSgWMVhbng +/ZgxKrnVl1NPBivDV5kPg+jD1BIOUlQimyrD6sL3AoGBAOnnRCZpWs1GjHrly5ub +n846TMR2hCl5qAGphg/vfIbxYrT8LzII8FK2xZGBMJmn3eQ0JGqkc5KUjrwV15gN +v+LB/yF4JaVAG7IMoPYstnpfF5SIhQnL8NG4906P0Dd9t+PmQz6XXu4987FjOqAc +zYvVr5vhCFhvSvWcKJN7uGbDAoGBAKvJequlLZDXCEB9UHzkwymn3IMg9ihYQAQH +GV6Lw7H34gEoULQXRLw0xxlCPsduOPXkUbKxnYJ/drVDebmprh2KT4wAv3SG7eyZ +SGh/Wv7yFSDAJvSYWwfjDzufMtm5Mc3oupzgY1toD7GLNFH1xasbHswVGRK+5NFl +QlC1ipcNAoGBAIxqGyCai6btwDlbpkdI+ck2j7k9ndZ8sosc0G2se9d58sfsHdWe +1wpqe62t7mQZr+IgEyq7RuuEtRR6Xqb8RQqAuEdSms1zcWc30SJJhPiwxIeLL0dx +ly/HBBqnozD4BN3ENiqnIhOgeZE7XHaS43luYkYpBOuBaWYs5IIZWcct +-----END RSA PRIVATE KEY----- diff --git a/helm-charts/xos-services/hssdb/templates/_helpers.tpl b/helm-charts/xos-services/hssdb/templates/_helpers.tpl new file mode 100644 index 0000000..8733e55 --- /dev/null +++ b/helm-charts/xos-services/hssdb/templates/_helpers.tpl @@ -0,0 +1,80 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{/* +Expand the name of the chart. +*/}} +{{- define "hssdb.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "hssdb.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "hssdb.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- define "hssdb.serviceConfig" -}} +name: hssdb +accessor: + username: {{ .Values.xosAdminUser | quote }} + password: {{ .Values.xosAdminPassword | quote }} + endpoint: xos-core:50051 +logging: + version: 1 + handlers: + console: + class: logging.StreamHandler + file: + class: logging.handlers.RotatingFileHandler + filename: /var/log/xos.log + maxBytes: 10485760 + backupCount: 5 + kafka: + class: kafkaloghandler.KafkaLogHandler + bootstrap_servers: + - "cord-kafka:9092" + topic: xos.log.hssdb + loggers: + '': + handlers: + - console + - file + - kafka + level: DEBUG +proxy_ssh: + enabled: {{ .Values.global.proxySshEnabled }} + user: {{ .Values.global.proxySshUser }} +{{- end -}} diff --git a/helm-charts/xos-services/hssdb/templates/_tosca.tpl b/helm-charts/xos-services/hssdb/templates/_tosca.tpl new file mode 100644 index 0000000..ecae8da --- /dev/null +++ b/helm-charts/xos-services/hssdb/templates/_tosca.tpl @@ -0,0 +1,62 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{- define "hssdb.serviceTosca" -}} +tosca_definitions_version: tosca_simple_yaml_1_0 + +imports: + - custom_types/hssdbservice.yaml + - custom_types/hssdbvendor.yaml + - custom_types/flavor.yaml + - custom_types/image.yaml + +description: Configures the HSSDB service + +topology_template: + node_templates: + + service#hssdb: + type: tosca.nodes.HSSDBService + properties: + name: hssdb + public_key: {{ .publicKey | quote }} + private_key_fn: /opt/xos/services/hssdb/keys/id_rsa + + sprint_hssdb: + type: tosca.nodes.HSSDBVendor + properties: + name: sprint_hssdb_{{ .vnfImageVersion }} + requirements: + - image: + node: image_hssdb + relationship: tosca.relationships.BelongsToOne + - flavor: + node: {{ .vnfImageFlavor }} + relationship: tosca.relationships.BelongsToOne + + image_hssdb: + type: tosca.nodes.Image + properties: + name: image_hssdb_{{ .vnfImageVersion }} + disk_format: QCOW2 + container_format: BARE + path: {{ .vnfImageURL }} + + {{ .vnfImageFlavor }}: + type: tosca.nodes.Flavor + properties: + name: {{ .vnfImageFlavor }} +{{- end -}} diff --git a/helm-charts/xos-services/hssdb/templates/configmap.yaml b/helm-charts/xos-services/hssdb/templates/configmap.yaml new file mode 100644 index 0000000..81b880d --- /dev/null +++ b/helm-charts/xos-services/hssdb/templates/configmap.yaml @@ -0,0 +1,23 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: hssdb +data: + serviceConfig: | +{{ include "hssdb.serviceConfig" . | indent 4 }} diff --git a/helm-charts/xos-services/hssdb/templates/deployment.yaml b/helm-charts/xos-services/hssdb/templates/deployment.yaml new file mode 100644 index 0000000..a71be99 --- /dev/null +++ b/helm-charts/xos-services/hssdb/templates/deployment.yaml @@ -0,0 +1,91 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: apps/v1beta2 +kind: Deployment +metadata: + name: {{ template "hssdb.fullname" . }} + labels: + app: {{ template "hssdb.name" . }} + chart: {{ template "hssdb.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + app: {{ template "hssdb.name" . }} + release: {{ .Release.Name }} + template: + metadata: + labels: + app: {{ template "hssdb.name" . }} + release: {{ .Release.Name }} + annotations: + checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} + spec: + containers: + - name: {{ .Chart.Name }} + image: {{ .Values.global.registry }}{{ .Values.image.repository }}:{{ tpl .Values.image.tag . }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + resources: +{{ toYaml .Values.resources | indent 12 }} + volumeMounts: + - name: hssdb-config + mountPath: /opt/xos/synchronizers/hssdb/mounted_config.yaml + subPath: mounted_config.yaml + - name: certchain-volume + mountPath: /usr/local/share/ca-certificates/local_certs.crt + subPath: config/ca_cert_chain.pem + - name: hssdb-keys + mountPath: /opt/xos/services/hssdb/keys + readOnly: true + - name: node-key + mountPath: /opt/cord_profile + readOnly: true + volumes: + - name: hssdb-config + configMap: + name: hssdb + items: + - key: serviceConfig + path: mounted_config.yaml + - name: certchain-volume + configMap: + name: ca-certificates + items: + - key: chain + path: config/ca_cert_chain.pem + - name: hssdb-keys + secret: + secretName: hssdb-keys + defaultMode: 256 + - name: node-key + secret: + secretName: node-key + defaultMode: 256 + optional: true + {{- with .Values.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} diff --git a/helm-charts/xos-services/hssdb/templates/secret.yaml b/helm-charts/xos-services/hssdb/templates/secret.yaml new file mode 100644 index 0000000..3cc52d9 --- /dev/null +++ b/helm-charts/xos-services/hssdb/templates/secret.yaml @@ -0,0 +1,23 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Secret +metadata: + name: hssdb-keys + namespace: default +type: Opaque +data: + id_rsa: {{ .Files.Get .Values.privateKeyFile | b64enc }} \ No newline at end of file diff --git a/helm-charts/xos-services/hssdb/values.yaml b/helm-charts/xos-services/hssdb/values.yaml new file mode 100644 index 0000000..410178e --- /dev/null +++ b/helm-charts/xos-services/hssdb/values.yaml @@ -0,0 +1,52 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Default values for hssdb. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +nameOverride: "" +fullnameOverride: "" + +image: + repository: 'xosproject/hssdb-synchronizer' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + +xosAdminUser: "admin@opencord.org" +xosAdminPassword: "letmein" + +vnfImageURL: "https://github.com/opencord/hss_db/releases/download/vms/image-hss-db.qcow2.v0.1.1" +vnfImageVersion: "v0.1.1" +vnfImageFlavor: "m1.large" + +publicKey: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDL5L5vDsQ1bmSeisxMf/GZEqv85oHHu6RFE17VYoTAuBBsHQnETOccbQT85qSBy5NAMAICtOd15iXYfmul0eFeSHoQr1H3IAXT0if6ANxXOm8/Z2rlRNthOEgsjDQU9foNxQ4wksygy5epKmbEhMqbFZjuj4zYfStPzE/gkFSE9QjhKMWaJmyLFfq9f8DnC+TTE41K5iGbtramr7qHSWsKKy75XV6MZZLLFExrQqlYDlLA2V0aYezCql3fB96KJmf6GJRT3j3Y7oWaj7gEzMCycA2QgP8ZNFL/2Q1qgvQRc6I46/HUiOh3IT8LVDdo2ZUn9qrNameQ1zR7a+wBvYIV Insecure M-CORD keypair" +privateKeyFile: "files/id_rsa" + +# These variables can be overridden by the profile chart +global: + proxySshEnabled: true + proxySshUser: "root" + registry: '' + +resources: {} + +nodeSelector: {} + +tolerations: [] + +affinity: {} diff --git a/helm-charts/xos-services/internetemulator/.helmignore b/helm-charts/xos-services/internetemulator/.helmignore new file mode 100644 index 0000000..f0c1319 --- /dev/null +++ b/helm-charts/xos-services/internetemulator/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/helm-charts/xos-services/internetemulator/Chart.yaml b/helm-charts/xos-services/internetemulator/Chart.yaml new file mode 100644 index 0000000..adc8e8d --- /dev/null +++ b/helm-charts/xos-services/internetemulator/Chart.yaml @@ -0,0 +1,22 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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: internetemulator +description: A Helm chart for XOS's "internetemulator" service +icon: https://guide.opencord.org/logos/cord.svg + +version: 1.0.2 +appVersion: 1.0.2 + diff --git a/helm-charts/xos-services/internetemulator/files/id_rsa b/helm-charts/xos-services/internetemulator/files/id_rsa new file mode 100644 index 0000000..c840002 --- /dev/null +++ b/helm-charts/xos-services/internetemulator/files/id_rsa @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpgIBAAKCAQEAy+S+bw7ENW5knorMTH/xmRKr/OaBx7ukRRNe1WKEwLgQbB0J +xEznHG0E/OakgcuTQDACArTndeYl2H5rpdHhXkh6EK9R9yAF09In+gDcVzpvP2dq +5UTbYThILIw0FPX6DcUOMJLMoMuXqSpmxITKmxWY7o+M2H0rT8xP4JBUhPUI4SjF +miZsixX6vX/A5wvk0xONSuYhm7a2pq+6h0lrCisu+V1ejGWSyxRMa0KpWA5SwNld +GmHswqpd3wfeiiZn+hiUU9492O6Fmo+4BMzAsnANkID/GTRS/9kNaoL0EXOiOOvx +1IjodyE/C1Q3aNmVJ/aqzWpnkNc0e2vsAb2CFQIDAQABAoIBAQDGRZByCtf+ZXVv +PuXgVmKoSiH5cmYtxmi9y1JjCsSxa8x8ddhzjZ0IZXN+QwMiPMbamlS6MRUL71xK +JNWlkG0p9CzPYM3CFN/V1f2N/ZxHLsnTzEuE2+rBpat5tnVHFNOu5DsiPP7ENncq +x9Lbs44aNWxcQDfkpgOiO7pJU9D84FYuJbH6EhHCt1nuyUeHaG7qqsDYnaGo6NSc +qqnmrvoSBOQ+CIXgqRwGuetN9kNF/nKOWxWiZ+VAYIXb7cnkmOWTg5ojPifCWMeE +xiV9agFzEEJhPxhivFtIq0XvsiSlAZvZcREXKayw6zFx9JTgpOXYln+xg0pQEVXr +MLWv7BTZAoGBAPLy1Z7qjeR9PwTZen970AS3BsATQAcAh4aEHGPxwLmWDkhzJTW7 +C2U4dSyjB1W6OL6y4u7aggO5nshsEUZ73hE37b1/sr1PYC+NXuXuThDYDFD3f5LA +HwU0Xvx+uibV75+XpOkClSBkf2k6eBFD68PaLyjfCSnEkzukWPtngxRTAoGBANbY +zXFKIrcQtAz2p3+txU9Xqa5xK2rQfLurc66xxxC3KO8oMhYP2htieYRygwg91JR2 +Bu6sX8+t5MNYSso1t8CSO36tcgUDowo+2XuvY9FwQUgViHNKOb7cFrNSgWMVhbng +/ZgxKrnVl1NPBivDV5kPg+jD1BIOUlQimyrD6sL3AoGBAOnnRCZpWs1GjHrly5ub +n846TMR2hCl5qAGphg/vfIbxYrT8LzII8FK2xZGBMJmn3eQ0JGqkc5KUjrwV15gN +v+LB/yF4JaVAG7IMoPYstnpfF5SIhQnL8NG4906P0Dd9t+PmQz6XXu4987FjOqAc +zYvVr5vhCFhvSvWcKJN7uGbDAoGBAKvJequlLZDXCEB9UHzkwymn3IMg9ihYQAQH +GV6Lw7H34gEoULQXRLw0xxlCPsduOPXkUbKxnYJ/drVDebmprh2KT4wAv3SG7eyZ +SGh/Wv7yFSDAJvSYWwfjDzufMtm5Mc3oupzgY1toD7GLNFH1xasbHswVGRK+5NFl +QlC1ipcNAoGBAIxqGyCai6btwDlbpkdI+ck2j7k9ndZ8sosc0G2se9d58sfsHdWe +1wpqe62t7mQZr+IgEyq7RuuEtRR6Xqb8RQqAuEdSms1zcWc30SJJhPiwxIeLL0dx +ly/HBBqnozD4BN3ENiqnIhOgeZE7XHaS43luYkYpBOuBaWYs5IIZWcct +-----END RSA PRIVATE KEY----- diff --git a/helm-charts/xos-services/internetemulator/templates/_helpers.tpl b/helm-charts/xos-services/internetemulator/templates/_helpers.tpl new file mode 100644 index 0000000..e9b0768 --- /dev/null +++ b/helm-charts/xos-services/internetemulator/templates/_helpers.tpl @@ -0,0 +1,80 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{/* +Expand the name of the chart. +*/}} +{{- define "internetemulator.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "internetemulator.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "internetemulator.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- define "internetemulator.serviceConfig" -}} +name: internetemulator +accessor: + username: {{ .Values.xosAdminUser | quote }} + password: {{ .Values.xosAdminPassword | quote }} + endpoint: xos-core:50051 +logging: + version: 1 + handlers: + console: + class: logging.StreamHandler + file: + class: logging.handlers.RotatingFileHandler + filename: /var/log/xos.log + maxBytes: 10485760 + backupCount: 5 + kafka: + class: kafkaloghandler.KafkaLogHandler + bootstrap_servers: + - "cord-kafka:9092" + topic: xos.log.internetemulator + loggers: + '': + handlers: + - console + - file + - kafka + level: DEBUG +proxy_ssh: + enabled: {{ .Values.global.proxySshEnabled }} + user: {{ .Values.global.proxySshUser }} +{{- end -}} diff --git a/helm-charts/xos-services/internetemulator/templates/_tosca.tpl b/helm-charts/xos-services/internetemulator/templates/_tosca.tpl new file mode 100644 index 0000000..53fa4c8 --- /dev/null +++ b/helm-charts/xos-services/internetemulator/templates/_tosca.tpl @@ -0,0 +1,43 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{- define "internetemulator.serviceTosca" -}} +tosca_definitions_version: tosca_simple_yaml_1_0 + +imports: + - custom_types/internetemulatorservice.yaml + - custom_types/image.yaml + +description: Configures the internetemulator service + +topology_template: + node_templates: + + service#internetemulator: + type: tosca.nodes.InternetEmulatorService + properties: + name: internetemulator + public_key: {{ .publicKey | quote }} + private_key_fn: /opt/xos/services/internetemulator/keys/id_rsa + + image_internetemulator: + type: tosca.nodes.Image + properties: + name: image_internetemulator_{{ .vnfImageVersion }} + disk_format: QCOW2 + container_format: BARE + path: {{ .vnfImageURL }} +{{- end -}} diff --git a/helm-charts/xos-services/internetemulator/templates/configmap.yaml b/helm-charts/xos-services/internetemulator/templates/configmap.yaml new file mode 100644 index 0000000..6e00709 --- /dev/null +++ b/helm-charts/xos-services/internetemulator/templates/configmap.yaml @@ -0,0 +1,23 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: internetemulator +data: + serviceConfig: | +{{ include "internetemulator.serviceConfig" . | indent 4 }} diff --git a/helm-charts/xos-services/internetemulator/templates/deployment.yaml b/helm-charts/xos-services/internetemulator/templates/deployment.yaml new file mode 100644 index 0000000..2e57bbe --- /dev/null +++ b/helm-charts/xos-services/internetemulator/templates/deployment.yaml @@ -0,0 +1,90 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: apps/v1beta2 +kind: Deployment +metadata: + name: {{ template "internetemulator.fullname" . }} + labels: + app: {{ template "internetemulator.name" . }} + chart: {{ template "internetemulator.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + app: {{ template "internetemulator.name" . }} + release: {{ .Release.Name }} + template: + metadata: + labels: + app: {{ template "internetemulator.name" . }} + release: {{ .Release.Name }} + annotations: + checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} + spec: + containers: + - name: {{ .Chart.Name }} + image: {{ .Values.global.registry }}{{ .Values.image.repository }}:{{ tpl .Values.image.tag . }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + resources: +{{ toYaml .Values.resources | indent 12 }} + volumeMounts: + - name: internetemulator-config + mountPath: /opt/xos/synchronizers/internetemulator/mounted_config.yaml + subPath: mounted_config.yaml + - name: certchain-volume + mountPath: /usr/local/share/ca-certificates/local_certs.crt + subPath: config/ca_cert_chain.pem + - name: internetemulator-keys + mountPath: /opt/xos/services/internetemulator/keys + readOnly: true + - name: node-key + mountPath: /opt/cord_profile + readOnly: true + volumes: + - name: internetemulator-config + configMap: + name: internetemulator + items: + - key: serviceConfig + path: mounted_config.yaml + - name: certchain-volume + configMap: + name: ca-certificates + items: + - key: chain + path: config/ca_cert_chain.pem + - name: internetemulator-keys + secret: + secretName: internetemulator-keys + - name: node-key + secret: + secretName: node-key + defaultMode: 256 + optional: true + {{- with .Values.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} diff --git a/helm-charts/xos-services/internetemulator/templates/secret.yaml b/helm-charts/xos-services/internetemulator/templates/secret.yaml new file mode 100644 index 0000000..dbc9fa1 --- /dev/null +++ b/helm-charts/xos-services/internetemulator/templates/secret.yaml @@ -0,0 +1,23 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Secret +metadata: + name: internetemulator-keys + namespace: default +type: Opaque +data: + id_rsa: {{ .Files.Get .Values.privateKeyFile | b64enc }} \ No newline at end of file diff --git a/helm-charts/xos-services/internetemulator/values.yaml b/helm-charts/xos-services/internetemulator/values.yaml new file mode 100644 index 0000000..48d8ae7 --- /dev/null +++ b/helm-charts/xos-services/internetemulator/values.yaml @@ -0,0 +1,51 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Default values for internetemulator. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +nameOverride: "" +fullnameOverride: "" + +image: + repository: 'xosproject/internetemulator-synchronizer' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + +xosAdminUser: "admin@opencord.org" +xosAdminPassword: "letmein" + +vnfImageURL: "https://github.com/opencord/internetemulator/releases/download/vms/image-internetemulator.qcow2.v0.1.1" +vnfImageVersion: "v0.1.1" + +publicKey: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDL5L5vDsQ1bmSeisxMf/GZEqv85oHHu6RFE17VYoTAuBBsHQnETOccbQT85qSBy5NAMAICtOd15iXYfmul0eFeSHoQr1H3IAXT0if6ANxXOm8/Z2rlRNthOEgsjDQU9foNxQ4wksygy5epKmbEhMqbFZjuj4zYfStPzE/gkFSE9QjhKMWaJmyLFfq9f8DnC+TTE41K5iGbtramr7qHSWsKKy75XV6MZZLLFExrQqlYDlLA2V0aYezCql3fB96KJmf6GJRT3j3Y7oWaj7gEzMCycA2QgP8ZNFL/2Q1qgvQRc6I46/HUiOh3IT8LVDdo2ZUn9qrNameQ1zR7a+wBvYIV Insecure M-CORD keypair" +privateKeyFile: "files/id_rsa" + +# These variables can be overridden by the profile chart +global: + proxySshEnabled: true + proxySshUser: "root" + registry: '' + +resources: {} + +nodeSelector: {} + +tolerations: [] + +affinity: {} diff --git a/helm-charts/xos-services/k8sepcservice/Chart.yaml b/helm-charts/xos-services/k8sepcservice/Chart.yaml new file mode 100644 index 0000000..a8ff283 --- /dev/null +++ b/helm-charts/xos-services/k8sepcservice/Chart.yaml @@ -0,0 +1,21 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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: k8sepcservice +description: A Helm chart for XOS's "k8sepcservice" service +icon: https://guide.opencord.org/logos/cord.svg + +version: 1.0.2 +appVersion: 1.0.2 diff --git a/helm-charts/xos-services/k8sepcservice/templates/_helpers.tpl b/helm-charts/xos-services/k8sepcservice/templates/_helpers.tpl new file mode 100644 index 0000000..24269b1 --- /dev/null +++ b/helm-charts/xos-services/k8sepcservice/templates/_helpers.tpl @@ -0,0 +1,87 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{/* +Expand the name of the chart. +*/}} +{{- define "vepcservice.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "vepcservice.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "vepcservice.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- define "vepcservice.serviceConfig" -}} +name: vepcservice +accessor: + username: {{ .Values.xosAdminUser | quote }} + password: {{ .Values.xosAdminPassword | quote }} + endpoint: xos-core:50051 +event_bus: + endpoint: {{ .Values.kafkaService | quote }} + kind: kafka +required_models: + - VEpcService + - VEpcServiceInstance + - VEpcResourceInstanceLink + - ServiceDependency + - KubernetesService + - KubernetesResourceInstance +dependency_graph: "/opt/xos/synchronizers/vepcservice/model-deps" +steps_dir: "/opt/xos/synchronizers/vepcservice/steps" +event_steps_dir: "/opt/xos/synchronizers/vepcservice/event_steps" +sys_dir: "/opt/xos/synchronizers/vepcservice/sys" +model_policies_dir: "/opt/xos/synchronizers/vepcservice/model_policies" +models_dir: "/opt/xos/synchronizers/vepcservice/models" +logging: + version: 1 + handlers: + console: + class: logging.StreamHandler + file: + class: logging.handlers.RotatingFileHandler + filename: /var/log/xos.log + maxBytes: 10485760 + backupCount: 5 + loggers: + 'multistructlog': + handlers: + - console + - file + level: DEBUG +{{- end -}} diff --git a/helm-charts/xos-services/k8sepcservice/templates/_tosca.tpl b/helm-charts/xos-services/k8sepcservice/templates/_tosca.tpl new file mode 100644 index 0000000..bfda6a8 --- /dev/null +++ b/helm-charts/xos-services/k8sepcservice/templates/_tosca.tpl @@ -0,0 +1,737 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{- define "vepcservice.serviceTosca" -}} +tosca_definitions_version: tosca_simple_yaml_1_0 + +imports: + - custom_types/image.yaml + - custom_types/site.yaml + - custom_types/vepcservice.yaml + - custom_types/slice.yaml + - custom_types/trustdomain.yaml + +description: Configures the virtual EPC service + +topology_template: + node_templates: + + default_trustdomain: + type: tosca.nodes.TrustDomain + properties: + name: "default" + must-exist: true + + service#vepcservice: + type: tosca.nodes.VEpcService + properties: + name: vepcservice + mysite: + type: tosca.nodes.Site + properties: + name: "mysite" + must-exist: true + + vepcserviceinstance: + type: tosca.nodes.VEpcServiceInstance + properties: + name: "EPC2 for Compute" + requirements: + - owner: + node: service#vepcservice + relationship: tosca.relationships.BelongsToOne + + kubernetesresourceinstance_ngic_configmap: + type: tosca.nodes.KubernetesResourceInstance + properties: + name: "NGIC Config Map" + resource_definition: | + apiVersion: v1 + data: + adc_rules.cfg: | + #Format - + #[ IP | IP Prefix | domain ] DROP? Sponsor-ID Service-ID Rate-Group? [Tariff-Group Tariff-Time]? + # Note: it is possible that ADC rules have conflicts & in that case rules are applied by line number... + # Rules defined first have a higher priority, unless DROP is specified (i.e. multiple rules for the same IP + # When specifying DROP with an IP address, use a prefix of 32 to prevent DNS results from overwriting rule + + 13.1.1.111 Example Internet Zero-Rate + 13.1.1.112/24 Example Management Zero-Rate + 13.1.1.113 Example Provisioning Zero-Rate + www.example.gov Example Internet Zero-Rate + www.drop_example.com DROP Example CIPA + cp_config.cfg: | + SGW_S11_IP=$(hostname) + SGW_S1U_IP=$(netstat -ie | grep -A1 s1u-net | tail -1 | awk '{print $2}' | tr -d addr:) + MGMT_INFO="-s ${SGW_S11_IP} -m ${MME_S11_IP} -w ${SGW_S1U_IP}" + APN_INFO="-i ${IP_POOL_IP} -p ${IP_POOL_MASK} -a ${APN}" + TEID_INFO="-t ${S11_TEID_POOL_START} -e ${S11_TEID_POOL_STOP} -u ${S1U_TEID_POOL_START} -o ${S1U_TEID_POOL_STOP}" + APP_ARGS="${MGMT_INFO} ${APN_INFO} ${TEID_INFO}" + + CORES="-c $(taskset -p $$ | awk '{print $NF}')" + MEMORY="-n4 --no-huge -m 4096 --file-prefix cp" + DEVICES="--no-pci" + EAL_ARGS="${CORES} ${MEMORY} ${DEVICES}" + dp_config.cfg: | + CORES="-c $(taskset -p $$ | awk '{print $NF}')" + MEMORY="-n4 --no-huge -m 8192 --file-prefix cp" + + SGW_S1U_IP=$(netstat -ie | grep -A1 s1u-net | tail -1 | awk '{print $2}' | tr -d addr:) + SGW_SGI_IP=$(netstat -ie | grep -A1 sgi-net | tail -1 | awk '{print $2}' | tr -d addr:) + S1U_MAC=$( netstat -ie | grep -B1 $SGW_S1U_IP | head -n1 | awk '{print $5}' ) + SGI_MAC=$( netstat -ie | grep -B1 $SGW_SGI_IP | head -n1 | awk '{print $5}' ) + DEVICES="--no-pci --vdev eth_af_packet0,iface=s1u-net --vdev eth_af_packet1,iface=sgi-net" + + EAL_ARGS="${CORES} ${MEMORY} ${DEVICES}" + + S1U="--s1u_ip ${SGW_S1U_IP} --s1u_mac ${S1U_MAC}" + SGI="--sgi_ip ${SGW_SGI_IP} --sgi_mac ${SGI_MAC} --sgi_gw_ip ${RTR_SGI_IP} --sgi_mask ${SGI_MASK}" + WORKERS="--num_workers 1" + MISC="--log 1" + + APP_ARGS="${S1U} ${SGI} ${WORKERS} ${MISC}" + interface.cfg: "; Copyright (c) 2017 Intel Corporation\n;\n; Licensed under the + Apache License, Version 2.0 (the \"License\");\n; you may not use this file except + in compliance with the License.\n; You may obtain a copy of the License at\n;\n; + \ http://www.apache.org/licenses/LICENSE-2.0\n;\n; Unless required by applicable + law or agreed to in writing, software\n; distributed under the License is distributed + on an \"AS IS\" BASIS,\n; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + express or implied.\n; See the License for the specific language governing permissions + and\n; limitations under the License.\n\n[0]\ndp_comm_ip = 127.0.0.1\ndp_comm_port + = 20\ncp_comm_ip = 127.0.0.1\ncp_comm_port = 21\n" + static_pcc.cfg: |+ + [GLOBAL] + NUM_PACKET_FILTERS = 1 + + ;default filter - must be first for now (until DP doesn't install any filters) + [PACKET_FILTER_0] + RATING_GROUP = 9 + ;Max Bit Rate (MBR) unit= bps + MBR = 512000 + + [PACKET_FILTER_1] + RATING_GROUP = 5 + MBR = 1000000 + DIRECTION = bidirectional + PRECEDENCE = 255 + IPV4_REMOTE = 13.1.0.0 + IPV4_REMOTE_MASK = 255.255.0.0 + PROTOCOL = 17 + REMOTE_LOW_LIMIT_PORT = 5060 + REMOTE_HIGH_LIMIT_PORT = 5060 + + [PACKET_FILTER_2] + RATING_GROUP = 1 + MBR = 2000000 + DIRECTION = bidirectional + PRECEDENCE = 255 + IPV4_REMOTE = 13.1.0.0 + IPV4_REMOTE_MASK = 255.255.0.0 + PROTOCOL = 17 + LOCAL_LOW_LIMIT_PORT = 17000 + LOCAL_HIGH_LIMIT_PORT = 17010 + + [PACKET_FILTER_3] + RATING_GROUP = 7 + MBR = 4000000 + DIRECTION = bidirectional + PRECEDENCE = 255 + IPV4_REMOTE = 13.1.0.0 + IPV4_REMOTE_MASK = 255.255.0.0 + PROTOCOL = 17 + LOCAL_LOW_LIMIT_PORT = 8000 + LOCAL_HIGH_LIMIT_PORT = 8080 + + kind: ConfigMap + metadata: + name: ngic-config + namespace: epc2 + + requirements: + - owner: + node: service#kubernetes + relationship: tosca.relationships.BelongsToOne + + kubernetesresourceinstance_mme_service: + type: tosca.nodes.KubernetesResourceInstance + properties: + name: "MME Service" + resource_definition: | + apiVersion: v1 + kind: Service + metadata: + name: mme + namespace: epc2 + spec: + selector: + app: mme + clusterIP: None + ports: + - name: s11 + port: 2123 + protocol: UDP + - name: s1ap + port: 36412 + protocol: TCP + - name: s6a + port: 3868 + protocol: TCP + + requirements: + - owner: + node: service#kubernetes + relationship: tosca.relationships.BelongsToOne + + kubernetesresourceinstance_mme_statefulset: + type: tosca.nodes.KubernetesResourceInstance + properties: + name: "MME StatefulSet" + resource_definition: | + apiVersion: apps/v1 + kind: StatefulSet + metadata: + name: mme + namespace: epc2 + labels: + app: mme + spec: + replicas: 1 + selector: + matchLabels: + app: mme + serviceName: "mme" + template: + metadata: + labels: + app: mme + spec: + terminationGracePeriodSeconds: 1 + initContainers: + - name: init-mme + image: "ngick8stesting/c3po-mmeinit" + command: [ "sh", "-c"] + securityContext: + capabilities: + add: + - NET_ADMIN + args: + - iptables -A OUTPUT -p sctp --sport 36412 --chunk-types any ABORT -j DROP; + until nslookup hss-0.hss.epc2.svc.cluster.local; + do echo waiting for hss; sleep 2; done; + containers: + - name: mme + image: "ngick8stesting/c3po-mme:5e2eaf6" + imagePullPolicy: Always + env: + - name: SGW_S11_IP + value: ngic-0.ngic.epc2.svc.cluster.local + - name: MME_ETH0_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: ENB_S1AP_IP + value: 10.1.11.3 + - name: CONNECT_PEER + value: hss-0.hss.epc2.svc.cluster.local + - name: VAR_HSS_REALM + value: hss.epc2.svc.cluster.local + - name: HSS_S6A_IP + value: hss-0.hss.epc2.svc.cluster.local + - name: HSS_PORT + value: "3868" + + stdin: true + tty: true + #command: [ "sleep", "3600"] + #volumeMounts: + #- name: config-volume + # mountPath: /opt/ngic/config + #- name: scripts-volume + # mountPath: /opt/ngic/scripts + #- name: hugepage + # mountPath: /dev/hugepages + resources: + limits: + cpu: 3 + memory: 1Gi + #volumes: + # - name: config-volume + # configMap: + # name: ngic-config + # - name: scripts-volume + # secret: + # secretName: ngic-scripts + # defaultMode: 511 + # - name: hugepage + # emptyDir: + # medium: HugePages + + requirements: + - owner: + node: service#kubernetes + relationship: tosca.relationships.BelongsToOne + + kubernetesresourceinstance_hss_service: + type: tosca.nodes.KubernetesResourceInstance + properties: + name: "HSS Service" + resource_definition: | + apiVersion: v1 + kind: Service + metadata: + name: hss + namespace: epc2 + spec: + selector: + app: hss + clusterIP: None + ports: + - name: s6a + port: 3868 + protocol: TCP + + requirements: + - owner: + node: service#kubernetes + relationship: tosca.relationships.BelongsToOne + + kubernetesresourceinstance_hss_statefulset: + type: tosca.nodes.KubernetesResourceInstance + properties: + name: "HSS StatefulSet" + resource_definition: | + apiVersion: apps/v1 + kind: StatefulSet + metadata: + name: hss + namespace: epc2 + labels: + app: hss + spec: + replicas: 1 + selector: + matchLabels: + app: hss + serviceName: "hss" + template: + metadata: + labels: + app: hss + spec: + terminationGracePeriodSeconds: 1 + initContainers: + - name: init-db + image: "ngick8stesting/c3po-cassandra:5e2eaf6" + command: [ "bash", "-xc"] + args: + - until nslookup cassandra; do echo waiting for cassandra; sleep 2; done; + cqlsh --file /scripts/oai_db.cql cassandra; + /scripts/data_provisioning_users.sh 208014567891200 1122334455 apn1 465B5CE8B199B49FAA5F0A2EE238A6BC 100 cassandra mme-0.mme.epc2.svc.cluster.local mme.epc2.svc.cluster.local; + /scripts/data_provisioning_mme.sh 1 19136246000 mme-0.mme.epc2.svc.cluster.local mme.epc2.svc.cluster.local 1 cassandra; + /scripts/data_provisioning_mme.sh 1 19136246000 smsrouter.test3gpp.net test3gpp.net 0 cassandra; + containers: + - name: hss + image: "ngick8stesting/c3po-hss:5e2eaf6" + imagePullPolicy: Always + env: + - name: CASSANDRA_ADDR + value: cassandra + - name: MME_ADDR + value: mme-0.mme.epc2.svc.cluster.local + #command: [ "sleep", "3600"] + resources: + limits: + cpu: 3 + memory: 1Gi + + requirements: + - owner: + node: service#kubernetes + relationship: tosca.relationships.BelongsToOne + + kubernetesresourceinstance_hssdb_service: + type: tosca.nodes.KubernetesResourceInstance + properties: + name: "HSS Cassandra Service" + resource_definition: | + apiVersion: v1 + kind: Service + metadata: + labels: + app: cassandra + name: cassandra + namespace: epc2 + spec: + clusterIP: None + ports: + - port: 9042 + selector: + app: cassandra + + requirements: + - owner: + node: service#kubernetes + relationship: tosca.relationships.BelongsToOne + + kubernetesresourceinstance_hssdb_statefulset: + type: tosca.nodes.KubernetesResourceInstance + properties: + name: "HSS Cassandra StatefulSet" + resource_definition: | + apiVersion: "apps/v1" + kind: StatefulSet + metadata: + name: cassandra + namespace: epc2 + labels: + app: cassandra + spec: + serviceName: cassandra + replicas: 1 # 3 + selector: + matchLabels: + app: cassandra + template: + metadata: + labels: + app: cassandra + spec: + terminationGracePeriodSeconds: 1 + containers: + - name: cassandra + image: ngick8stesting/c3po-cassandra:5e2eaf6 + imagePullPolicy: Always + ports: + - containerPort: 7000 + name: intra-node + - containerPort: 7001 + name: tls-intra-node + - containerPort: 7199 + name: jmx + - containerPort: 9042 + name: cql + resources: + limits: + cpu: "3" + memory: 4Gi + # Probably Cassandra:3.x? + #securityContext: + # capabilities: + # add: + # - IPC_LOCK + # Later + #lifecycle: + # preStop: + # exec: + # command: + # - /bin/sh + # - -c + # - nodetool drain + env: + # Performance optimizations + - name: MAX_HEAP_SIZE + value: 512M + - name: HEAP_NEWSIZE + value: 100M + - name: CASSANDRA_SEEDS + value: "cassandra-0.cassandra.epc2.svc.cluster.local" + - name: CASSANDRA_CLUSTER_NAME + value: "HSS Cluster" + - name: CASSANDRA_RPC_ADDRESS + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: CASSANDRA_ENDPOINT_SNITCH + value: "GossipingPropertyFileSnitch" + readinessProbe: + exec: + command: ["/bin/bash", "-c", "nodetool status -r | awk -v h=$(hostname) '$2==h {exit ($1==\"UN\" ? 0 : -1)}'"] + initialDelaySeconds: 15 + timeoutSeconds: 5 + # volumeMounts: + # - name: cassandra-data + # mountPath: /var/lib/cassandra + # volumeClaimTemplates: + # - metadata: + # name: cassandra-data + # spec: + # accessModes: [ "ReadWriteOnce" ] + # resources: + # requests: + # storage: 1Gi + + requirements: + - owner: + node: service#kubernetes + relationship: tosca.relationships.BelongsToOne + + kubernetesresourceinstance_spgwcu_service: + type: tosca.nodes.KubernetesResourceInstance + properties: + name: "SPGW Control and User Service" + resource_definition: | + apiVersion: v1 + kind: Service + metadata: + name: ngic + namespace: epc2 + spec: + selector: + app: ngic + clusterIP: None + ports: + - name: s11 + port: 2123 + protocol: UDP + + requirements: + - owner: + node: service#kubernetes + relationship: tosca.relationships.BelongsToOne + + kubernetesresourceinstance_spgwcu_statefulset: + type: tosca.nodes.KubernetesResourceInstance + properties: + name: "SPGW Control and User StatefulSet" + resource_definition: | + apiVersion: apps/v1 + kind: StatefulSet + metadata: + name: ngic + namespace: epc2 + labels: + app: ngic + spec: + replicas: 1 + selector: + matchLabels: + app: ngic + serviceName: "ngic" + template: + metadata: + labels: + app: ngic + annotations: + kubernetes.v1.cni.cncf.io/networks: '[ + { "name": "s1u-net", "interfaceRequest": "s1u-net" }, + { "name": "sgi-net", "interfaceRequest": "sgi-net" } + ]' + spec: + initContainers: + - name: init-iptables + image: "ngick8stesting/c3po-mmeinit" + command: [ "sh", "-c"] + securityContext: + capabilities: + add: + - NET_ADMIN + args: + - iptables -I OUTPUT -p icmp --icmp-type destination-unreachable -j DROP; + terminationGracePeriodSeconds: 1 + containers: + - name: ngic-cp + image: "ngick8stesting/ngic-cp:d9b315c" + stdin: true + command: [ "bash", "-cx", ". /opt/ngic/config/cp_config.cfg; ./ngic_controlplane $EAL_ARGS -- $APP_ARGS"] + #command: ["sleep", "3600"] + tty: true + env: + - name: MME_S11_IP + value: mme-0.mme.epc2.svc.cluster.local + #- name: SGW_S1U_IP # for now,this will be in our own pod + # value: "5.5.5.5" + - name: APN + value: apn1 + - name: IP_POOL_IP + value: "16.0.0.0" + - name: IP_POOL_MASK + value: "255.240.0.0" + - name: S11_TEID_POOL_START + value: "00100000" + - name: S11_TEID_POOL_STOP + value: "001fffff" + - name: S1U_TEID_POOL_START + value: "00100000" + - name: S1U_TEID_POOL_STOP + value: "001fffff" + volumeMounts: + - name: config-volume + mountPath: /opt/ngic/config + #- name: hugepage + # mountPath: /dev/hugepages + resources: + limits: + #hugepages-2Mi: 4Gi + cpu: 3 + memory: 4Gi + - name: ngic-dp + image: "ngiccorddemo/ngic-dp:k8s-bm" + stdin: true + tty: true + env: + - name: RTR_SGI_IP + value: "13.1.1.110" + - name: SGI_MASK + value: "255.255.255.0" + command: [ "bash", "-cx", ". /opt/ngic/config/dp_config.cfg ; ./ngic_dataplane $EAL_ARGS -- $APP_ARGS"] + #command: ["sleep", "3600"] + volumeMounts: + - name: config-volume + mountPath: /opt/ngic/config + #- name: hugepage + # mountPath: /dev/hugepages + resources: + limits: + #hugepages-1Gi: 8Gi + cpu: 8 + memory: 8Gi #200Mi + intel.com/sriov: '2' + securityContext: + privileged: true + capabilities: + add: + - NET_ADMIN + - IPC_LOCK + volumes: + - name: config-volume + configMap: + name: ngic-config + #- name: hugepage + # emptyDir: + # medium: HugePages + + requirements: + - owner: + node: service#kubernetes + relationship: tosca.relationships.BelongsToOne + + vepcresourceinstancelink_ngic_configmap: + type: tosca.nodes.VEpcResourceInstanceLink + properties: + name: "NGIC ConfigMap Resource Link" + + requirements: + - resource_instance: + node: kubernetesresourceinstance_ngic_configmap + relationship: tosca.relationships.BelongsToOne + - vepc_service_instance: + node: vepcserviceinstance + relationship: tosca.relationships.BelongsToOne + + vepcresourceinstancelink_mme_service: + type: tosca.nodes.VEpcResourceInstanceLink + properties: + name: "MME Service Resource Link" + + requirements: + - resource_instance: + node: kubernetesresourceinstance_mme_service + relationship: tosca.relationships.BelongsToOne + - vepc_service_instance: + node: vepcserviceinstance + relationship: tosca.relationships.BelongsToOne + + vepcresourceinstancelink_mme_statefulset: + type: tosca.nodes.VEpcResourceInstanceLink + properties: + name: "MME StatefulSet Resource Link" + + requirements: + - resource_instance: + node: kubernetesresourceinstance_mme_statefulset + relationship: tosca.relationships.BelongsToOne + - vepc_service_instance: + node: vepcserviceinstance + relationship: tosca.relationships.BelongsToOne + + vepcresourceinstancelink_hss_service: + type: tosca.nodes.VEpcResourceInstanceLink + properties: + name: "HSS Service Resource Link" + + requirements: + - resource_instance: + node: kubernetesresourceinstance_hss_service + relationship: tosca.relationships.BelongsToOne + - vepc_service_instance: + node: vepcserviceinstance + relationship: tosca.relationships.BelongsToOne + + vepcresourceinstancelink_hss_statefulset: + type: tosca.nodes.VEpcResourceInstanceLink + properties: + name: "HSS StatefulSet Resource Link" + + requirements: + - resource_instance: + node: kubernetesresourceinstance_hss_statefulset + relationship: tosca.relationships.BelongsToOne + - vepc_service_instance: + node: vepcserviceinstance + relationship: tosca.relationships.BelongsToOne + + vepcresourceinstancelink_hssdb_service: + type: tosca.nodes.VEpcResourceInstanceLink + properties: + name: "HSS Cassandra Service Resource Link" + + requirements: + - resource_instance: + node: kubernetesresourceinstance_hssdb_service + relationship: tosca.relationships.BelongsToOne + - vepc_service_instance: + node: vepcserviceinstance + relationship: tosca.relationships.BelongsToOne + + vepcresourceinstancelink_hssdb_statefulset: + type: tosca.nodes.VEpcResourceInstanceLink + properties: + name: "HSS Cassandra StatefulSet Resource Link" + + requirements: + - resource_instance: + node: kubernetesresourceinstance_hssdb_statefulset + relationship: tosca.relationships.BelongsToOne + - vepc_service_instance: + node: vepcserviceinstance + relationship: tosca.relationships.BelongsToOne + + vepcresourceinstancelink_spgwcu_service: + type: tosca.nodes.VEpcResourceInstanceLink + properties: + name: "SPGW Contol and User Service Resource Link" + + requirements: + - resource_instance: + node: kubernetesresourceinstance_spgwcu_service + relationship: tosca.relationships.BelongsToOne + - vepc_service_instance: + node: vepcserviceinstance + relationship: tosca.relationships.BelongsToOne + + vepcresourceinstancelink_spgwcu_statefulset: + type: tosca.nodes.VEpcResourceInstanceLink + properties: + name: "HS SPGW Control and User StatefulSet Resource Link" + + requirements: + - resource_instance: + node: kubernetesresourceinstance_spgwcu_statefulset + relationship: tosca.relationships.BelongsToOne + - vepc_service_instance: + node: vepcserviceinstance + relationship: tosca.relationships.BelongsToOne +{{- end -}} diff --git a/helm-charts/xos-services/k8sepcservice/templates/configmap.yaml b/helm-charts/xos-services/k8sepcservice/templates/configmap.yaml new file mode 100644 index 0000000..3af03d7 --- /dev/null +++ b/helm-charts/xos-services/k8sepcservice/templates/configmap.yaml @@ -0,0 +1,23 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: vepcservice +data: + serviceConfig: | +{{ include "vepcservice.serviceConfig" . | indent 4 }} diff --git a/helm-charts/xos-services/k8sepcservice/templates/deployment.yaml b/helm-charts/xos-services/k8sepcservice/templates/deployment.yaml new file mode 100644 index 0000000..c017457 --- /dev/null +++ b/helm-charts/xos-services/k8sepcservice/templates/deployment.yaml @@ -0,0 +1,74 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: apps/v1beta2 +kind: Deployment +metadata: + name: {{ template "vepcservice.fullname" . }} + labels: + app: {{ template "vepcservice.name" . }} + chart: {{ template "vepcservice.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + app: {{ template "vepcservice.name" . }} + release: {{ .Release.Name }} + template: + metadata: + labels: + app: {{ template "vepcservice.name" . }} + release: {{ .Release.Name }} + spec: + containers: + - name: {{ .Chart.Name }} + image: {{ .Values.global.registry }}{{ .Values.image.repository }}:{{ tpl .Values.image.tag . }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + resources: +{{ toYaml .Values.resources | indent 12 }} + volumeMounts: + - name: vepcservice-config + mountPath: /opt/xos/synchronizers/vepcservice/vepcservice_config.yaml + subPath: vepcservice_config.yaml + - name: certchain-volume + mountPath: /usr/local/share/ca-certificates/local_certs.crt + subPath: config/ca_cert_chain.pem + volumes: + - name: vepcservice-config + configMap: + name: vepcservice + items: + - key: serviceConfig + path: vepcservice_config.yaml + - name: certchain-volume + configMap: + name: ca-certificates + items: + - key: chain + path: config/ca_cert_chain.pem + {{- with .Values.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} diff --git a/helm-charts/xos-services/k8sepcservice/values.yaml b/helm-charts/xos-services/k8sepcservice/values.yaml new file mode 100644 index 0000000..35ae662 --- /dev/null +++ b/helm-charts/xos-services/k8sepcservice/values.yaml @@ -0,0 +1,44 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Default values for vepcservice. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +nameOverride: "" +fullnameOverride: "" + +image: + repository: 'xosproject/k8sepcservice-synchronizer' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + +global: + registry: '' + +xosAdminUser: "admin@opencord.org" +xosAdminPassword: "letmein" + +kafkaService: "cord-kafka" + +resources: {} + +nodeSelector: {} + +tolerations: [] + +affinity: {} diff --git a/helm-charts/xos-services/kubernetes/Chart.yaml b/helm-charts/xos-services/kubernetes/Chart.yaml new file mode 100644 index 0000000..6708cf2 --- /dev/null +++ b/helm-charts/xos-services/kubernetes/Chart.yaml @@ -0,0 +1,21 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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: kubernetes +description: A Helm chart for XOS's "kubernetes" service +icon: https://guide.opencord.org/logos/cord.svg + +version: 1.2.0 +appVersion: 1.2.1 diff --git a/helm-charts/xos-services/kubernetes/templates/_helpers.tpl b/helm-charts/xos-services/kubernetes/templates/_helpers.tpl new file mode 100644 index 0000000..98ee611 --- /dev/null +++ b/helm-charts/xos-services/kubernetes/templates/_helpers.tpl @@ -0,0 +1,76 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{/* +Expand the name of the chart. +*/}} +{{- define "kubernetes.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "kubernetes.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "kubernetes.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- define "kubernetes.serviceConfig" -}} +name: kubernetes +accessor: + username: {{ .Values.xosAdminUser | quote }} + password: {{ .Values.xosAdminPassword | quote }} + endpoint: {{ .Values.xosCoreService | quote }} +event_bus: + endpoint: {{ .Values.kafkaService | quote }} + kind: kafka +logging: + version: 1 + handlers: + console: + class: logging.StreamHandler + file: + class: logging.handlers.RotatingFileHandler + filename: /var/log/xos.log + maxBytes: 10485760 + backupCount: 5 + kafka: + class: kafkaloghandler.KafkaLogHandler + bootstrap_servers: + - "{{ .Values.kafkaService }}:9092" + topic: xos.log.kubernetes + loggers: + '': + handlers: + - console + - file + - kafka + level: DEBUG +{{- end -}} diff --git a/helm-charts/xos-services/kubernetes/templates/configmap.yaml b/helm-charts/xos-services/kubernetes/templates/configmap.yaml new file mode 100644 index 0000000..96bcbf3 --- /dev/null +++ b/helm-charts/xos-services/kubernetes/templates/configmap.yaml @@ -0,0 +1,23 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: kubernetes +data: + serviceConfig: | +{{ include "kubernetes.serviceConfig" . | indent 4 }} diff --git a/helm-charts/xos-services/kubernetes/templates/deployment.yaml b/helm-charts/xos-services/kubernetes/templates/deployment.yaml new file mode 100644 index 0000000..83763ca --- /dev/null +++ b/helm-charts/xos-services/kubernetes/templates/deployment.yaml @@ -0,0 +1,78 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: apps/v1beta2 +kind: Deployment +metadata: + name: {{ template "kubernetes.fullname" . }} + labels: + app: {{ template "kubernetes.name" . }} + chart: {{ template "kubernetes.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + app: {{ template "kubernetes.name" . }} + release: {{ .Release.Name }} + template: + metadata: + labels: + app: {{ template "kubernetes.name" . }} + release: {{ .Release.Name }} + annotations: + checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} + spec: + serviceAccountName: kubernetes-synchronizer + containers: + - name: {{ .Chart.Name }} + image: {{ .Values.global.registry }}{{ .Values.image.repository }}:{{ tpl .Values.image.tag . }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + resources: +{{ toYaml .Values.resources | indent 12 }} + volumeMounts: + - name: kubernetes-config + mountPath: /opt/xos/synchronizers/kubernetes/mounted_config.yaml + subPath: mounted_config.yaml + - name: certchain-volume + mountPath: /usr/local/share/ca-certificates/local_certs.crt + subPath: config/ca_cert_chain.pem + volumes: + - name: kubernetes-config + configMap: + name: kubernetes + items: + - key: serviceConfig + path: mounted_config.yaml + - name: certchain-volume + configMap: + name: ca-certificates + items: + - key: chain + path: config/ca_cert_chain.pem + {{- with .Values.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} diff --git a/helm-charts/xos-services/kubernetes/values.yaml b/helm-charts/xos-services/kubernetes/values.yaml new file mode 100644 index 0000000..eb39651 --- /dev/null +++ b/helm-charts/xos-services/kubernetes/values.yaml @@ -0,0 +1,45 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Default values for kubernetes synchronizer. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +nameOverride: "" +fullnameOverride: "" + +image: + repository: 'xosproject/kubernetes-synchronizer' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + +global: + registry: '' + +xosAdminUser: "admin@opencord.org" +xosAdminPassword: "letmein" +xosCoreService: "xos-core:50051" + +kafkaService: "cord-kafka" + +resources: {} + +nodeSelector: {} + +tolerations: [] + +affinity: {} diff --git a/helm-charts/xos-services/mcord-subscriber/.helmignore b/helm-charts/xos-services/mcord-subscriber/.helmignore new file mode 100644 index 0000000..f0c1319 --- /dev/null +++ b/helm-charts/xos-services/mcord-subscriber/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/helm-charts/xos-services/mcord-subscriber/Chart.yaml b/helm-charts/xos-services/mcord-subscriber/Chart.yaml new file mode 100644 index 0000000..491dcec --- /dev/null +++ b/helm-charts/xos-services/mcord-subscriber/Chart.yaml @@ -0,0 +1,21 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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: mcord-subscriber +description: A Helm chart that creates a subscriber for the "mcord" service +icon: https://guide.opencord.org/logos/cord.svg + +version: 2.0.5 +appVersion: 2.0.5 diff --git a/helm-charts/xos-services/mcord-subscriber/templates/_helpers.tpl b/helm-charts/xos-services/mcord-subscriber/templates/_helpers.tpl new file mode 100644 index 0000000..a8ef696 --- /dev/null +++ b/helm-charts/xos-services/mcord-subscriber/templates/_helpers.tpl @@ -0,0 +1,77 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{/* +Expand the name of the chart. +*/}} +{{- define "mcord-subscriber.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "mcord-subscriber.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "mcord-subscriber.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- define "mcord-subscriber.serviceConfig" -}} +name: mcord +accessor: + username: {{ .Values.xosAdminUser | quote }} + password: {{ .Values.xosAdminPassword | quote }} + endpoint: xos-core:50051 +logging: + version: 1 + handlers: + console: + class: logging.StreamHandler + file: + class: logging.handlers.RotatingFileHandler + filename: /var/log/xos.log + maxBytes: 10485760 + backupCount: 5 + kafka: + class: kafkaloghandler.KafkaLogHandler + bootstrap_servers: + - "cord-kafka:9092" + topic: xos.log.mcord-subscriber + loggers: + '': + handlers: + - console + - file + - kafka + level: DEBUG +{{- end -}} diff --git a/helm-charts/xos-services/mcord-subscriber/templates/_tosca.tpl b/helm-charts/xos-services/mcord-subscriber/templates/_tosca.tpl new file mode 100644 index 0000000..50d2273 --- /dev/null +++ b/helm-charts/xos-services/mcord-subscriber/templates/_tosca.tpl @@ -0,0 +1,31 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{- define "mcord-subscriber.serviceTosca" -}} +tosca_definitions_version: tosca_simple_yaml_1_0 + +imports: + - custom_types/mcordsubscriberservice.yaml + +description: Configures the mcord-subscriber service + +topology_template: + node_templates: + service#mcord: + type: tosca.nodes.MCordSubscriberService + properties: + name: mcord +{{- end -}} diff --git a/helm-charts/xos-services/mcord-subscriber/templates/configmap.yaml b/helm-charts/xos-services/mcord-subscriber/templates/configmap.yaml new file mode 100644 index 0000000..6f54ff8 --- /dev/null +++ b/helm-charts/xos-services/mcord-subscriber/templates/configmap.yaml @@ -0,0 +1,23 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: mcord-subscriber +data: + serviceConfig: | +{{ include "mcord-subscriber.serviceConfig" . | indent 4 }} diff --git a/helm-charts/xos-services/mcord-subscriber/templates/job.yaml b/helm-charts/xos-services/mcord-subscriber/templates/job.yaml new file mode 100644 index 0000000..6e1ce5e --- /dev/null +++ b/helm-charts/xos-services/mcord-subscriber/templates/job.yaml @@ -0,0 +1,72 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: batch/v1 +kind: Job +metadata: + name: {{ template "mcord-subscriber.fullname" . }} + labels: + app: {{ template "mcord-subscriber.name" . }} + chart: {{ template "mcord-subscriber.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + template: + metadata: + labels: + app: {{ template "mcord-subscriber.name" . }} + release: {{ .Release.Name }} + annotations: + checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} + spec: + restartPolicy: Never + containers: + - name: {{ .Chart.Name }} + image: {{ .Values.global.registry }}{{ .Values.image.repository }}:{{ tpl .Values.image.tag . }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + resources: +{{ toYaml .Values.resources | indent 12 }} + volumeMounts: + - name: mcord-subscriber-config + mountPath: /opt/xos/synchronizers/mcord/mounted_config.yaml + subPath: mounted_config.yaml + - name: certchain-volume + mountPath: /usr/local/share/ca-certificates/local_certs.crt + subPath: config/ca_cert_chain.pem + volumes: + - name: mcord-subscriber-config + configMap: + name: mcord-subscriber + items: + - key: serviceConfig + path: mounted_config.yaml + - name: certchain-volume + configMap: + name: ca-certificates + items: + - key: chain + path: config/ca_cert_chain.pem + {{- with .Values.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} diff --git a/helm-charts/xos-services/mcord-subscriber/values.yaml b/helm-charts/xos-services/mcord-subscriber/values.yaml new file mode 100644 index 0000000..709c506 --- /dev/null +++ b/helm-charts/xos-services/mcord-subscriber/values.yaml @@ -0,0 +1,42 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Default values for mcord-subscriber. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +nameOverride: "" +fullnameOverride: "" + +image: + repository: 'xosproject/mcord-synchronizer' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + +global: + registry: '' + +xosAdminUser: "admin@opencord.org" +xosAdminPassword: "letmein" + +resources: {} + +nodeSelector: {} + +tolerations: [] + +affinity: {} diff --git a/helm-charts/xos-services/onos-service/.helmignore b/helm-charts/xos-services/onos-service/.helmignore new file mode 100644 index 0000000..f0c1319 --- /dev/null +++ b/helm-charts/xos-services/onos-service/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/helm-charts/xos-services/onos-service/Chart.yaml b/helm-charts/xos-services/onos-service/Chart.yaml new file mode 100644 index 0000000..8bb78c2 --- /dev/null +++ b/helm-charts/xos-services/onos-service/Chart.yaml @@ -0,0 +1,21 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +description: A Helm chart for XOS's "onos-service" service, which configures ONOS +name: onos-service +icon: https://guide.opencord.org/logos/cord.svg + +version: 2.1.0 +appVersion: 2.1.1 diff --git a/helm-charts/xos-services/onos-service/templates/_helpers.tpl b/helm-charts/xos-services/onos-service/templates/_helpers.tpl new file mode 100644 index 0000000..3d7d57c --- /dev/null +++ b/helm-charts/xos-services/onos-service/templates/_helpers.tpl @@ -0,0 +1,81 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{/* +Expand the name of the chart. +*/}} +{{- define "onos-service.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "onos-service.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "onos-service.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + + +{{- define "onos-service.serviceConfig" -}} +name: onos +accessor: + username: {{ .Values.xosAdminUser | quote }} + password: {{ .Values.xosAdminPassword | quote }} + endpoint: {{ .Values.xosCoreService | quote }} +event_bus: + endpoint: {{ .Values.kafkaService | quote }} + kind: kafka +logging: + version: 1 + handlers: + console: + class: logging.StreamHandler + file: + class: logging.handlers.RotatingFileHandler + filename: /var/log/xos.log + maxBytes: 10485760 + backupCount: 5 + kafka: + class: kafkaloghandler.KafkaLogHandler + bootstrap_servers: + - "{{ .Values.kafkaService }}:9092" + topic: xos.log.onos-service + loggers: + '': + handlers: + - console + - file + - kafka + level: DEBUG +{{- end -}} diff --git a/helm-charts/xos-services/onos-service/templates/_tosca.tpl b/helm-charts/xos-services/onos-service/templates/_tosca.tpl new file mode 100644 index 0000000..6f65bbb --- /dev/null +++ b/helm-charts/xos-services/onos-service/templates/_tosca.tpl @@ -0,0 +1,84 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} + +{{- define "onos-service.vtnAppTosca" -}} +tosca_definitions_version: tosca_simple_yaml_1_0 + +imports: + - custom_types/onosapp.yaml + - custom_types/onosservice.yaml + - custom_types/serviceinstanceattribute.yaml + +description: Configures the VTN ONOS service + +topology_template: + node_templates: + + service#ONOS_CORD: + type: tosca.nodes.ONOSService + properties: + name: ONOS_CORD + kind: data + rest_hostname: {{ .onosCordRestService | quote }} + rest_port: 8181 + + onos_app#openflow: + type: tosca.nodes.ONOSApp + properties: + name: org.onosproject.openflow + app_id: org.onosproject.openflow + requirements: + - owner: + node: service#ONOS_CORD + relationship: tosca.relationships.BelongsToOne + + onos_app#dhcp: + type: tosca.nodes.ONOSApp + properties: + name: org.onosproject.dhcp + app_id: org.onosproject.dhcp + requirements: + - owner: + node: service#ONOS_CORD + relationship: tosca.relationships.BelongsToOne + + onos_app#cord-config: + type: tosca.nodes.ONOSApp + properties: + name: cord-config + app_id: org.opencord.cord-config + url: {{ .cordConfigAppURL }} + version: 1.4.0 + dependencies: org.onosproject.openflow, org.onosproject.dhcp + requirements: + - owner: + node: service#ONOS_CORD + relationship: tosca.relationships.BelongsToOne + + onos_app#vtn: + type: tosca.nodes.ONOSApp + properties: + name: vtn + app_id: org.opencord.vtn + url: {{ .vtnAppURL }} + version: 1.6.0 + dependencies: org.opencord.cord-config + requirements: + - owner: + node: service#ONOS_CORD + relationship: tosca.relationships.BelongsToOne +{{- end -}} diff --git a/helm-charts/xos-services/onos-service/templates/configmap.yaml b/helm-charts/xos-services/onos-service/templates/configmap.yaml new file mode 100644 index 0000000..db13dd3 --- /dev/null +++ b/helm-charts/xos-services/onos-service/templates/configmap.yaml @@ -0,0 +1,22 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: onos-service +data: + serviceConfig: | +{{ include "onos-service.serviceConfig" . | indent 4 }} diff --git a/helm-charts/xos-services/onos-service/templates/deployment.yaml b/helm-charts/xos-services/onos-service/templates/deployment.yaml new file mode 100644 index 0000000..0398ee0 --- /dev/null +++ b/helm-charts/xos-services/onos-service/templates/deployment.yaml @@ -0,0 +1,76 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: apps/v1beta2 +kind: Deployment +metadata: + name: {{ template "onos-service.fullname" . }} + labels: + app: {{ template "onos-service.name" . }} + chart: {{ template "onos-service.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + app: {{ template "onos-service.name" . }} + release: {{ .Release.Name }} + template: + metadata: + labels: + app: {{ template "onos-service.name" . }} + release: {{ .Release.Name }} + annotations: + checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} + spec: + containers: + - name: {{ .Chart.Name }} + image: {{ .Values.global.registry }}{{ .Values.image.repository }}:{{ tpl .Values.image.tag . }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + resources: +{{ toYaml .Values.resources | indent 12 }} + volumeMounts: + - name: onos-service-config + mountPath: /opt/xos/synchronizers/onos/mounted_config.yaml + subPath: mounted_config.yaml + - name: certchain-volume + mountPath: /usr/local/share/ca-certificates/local_certs.crt + subPath: config/ca_cert_chain.pem + volumes: + - name: onos-service-config + configMap: + name: onos-service + items: + - key: serviceConfig + path: mounted_config.yaml + - name: certchain-volume + configMap: + name: ca-certificates + items: + - key: chain + path: config/ca_cert_chain.pem + {{- with .Values.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} diff --git a/helm-charts/xos-services/onos-service/values.yaml b/helm-charts/xos-services/onos-service/values.yaml new file mode 100644 index 0000000..f39612d --- /dev/null +++ b/helm-charts/xos-services/onos-service/values.yaml @@ -0,0 +1,51 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Default values for onos-service. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +nameOverride: "" +fullnameOverride: "" + +image: + repository: 'xosproject/onos-synchronizer' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + +global: + registry: "" + +xosAdminUser: "admin@opencord.org" +xosAdminPassword: "letmein" +xosCoreService: "xos-core:50051" + +kafkaService: "cord-kafka" + +cordConfigAppURL: "https://oss.sonatype.org/service/local/repositories/releases/content/org/opencord/cord-config/1.4.0/cord-config-1.4.0.oar" +vtnAppURL: "https://oss.sonatype.org/service/local/repositories/releases/content/org/opencord/vtn/1.6.0/vtn-1.6.0.oar" + +onosCordRestService: "onos-cord-ui.default.svc.cluster.local" +kafkaService: "cord-kafka.default.svc.cluster.local:9092" + +resources: {} + +nodeSelector: {} + +tolerations: [] + +affinity: {} diff --git a/helm-charts/xos-services/openstack/.helmignore b/helm-charts/xos-services/openstack/.helmignore new file mode 100644 index 0000000..f0c1319 --- /dev/null +++ b/helm-charts/xos-services/openstack/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/helm-charts/xos-services/openstack/Chart.yaml b/helm-charts/xos-services/openstack/Chart.yaml new file mode 100644 index 0000000..ab47746 --- /dev/null +++ b/helm-charts/xos-services/openstack/Chart.yaml @@ -0,0 +1,21 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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: openstack +description: A Helm chart for XOS's "openstack" service +icon: https://guide.opencord.org/logos/cord.svg + +version: 1.1.6 +appVersion: 1.1.5 diff --git a/helm-charts/xos-services/openstack/templates/_helpers.tpl b/helm-charts/xos-services/openstack/templates/_helpers.tpl new file mode 100644 index 0000000..35f2dff --- /dev/null +++ b/helm-charts/xos-services/openstack/templates/_helpers.tpl @@ -0,0 +1,75 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{/* +Expand the name of the chart. +*/}} +{{- define "openstack.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "openstack.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "openstack.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- define "openstack.serviceConfig" -}} +name: openstack +accessor: + username: {{ .Values.xosAdminUser | quote }} + password: {{ .Values.xosAdminPassword | quote }} + endpoint: xos-core:50051 +logging: + version: 1 + handlers: + console: + class: logging.StreamHandler + file: + class: logging.handlers.RotatingFileHandler + filename: /var/log/xos.log + maxBytes: 10485760 + backupCount: 5 + kafka: + class: kafkaloghandler.KafkaLogHandler + bootstrap_servers: + - "cord-kafka:9092" + topic: xos.log.openstack + loggers: + '': + handlers: + - console + - file + - kafka + level: DEBUG +nova: + ca_ssl_cert: "/etc/ssl/certs/ca-certificates.crt" + enabled: True +{{- end -}} diff --git a/helm-charts/xos-services/openstack/templates/_tosca.tpl b/helm-charts/xos-services/openstack/templates/_tosca.tpl new file mode 100644 index 0000000..3adabcd --- /dev/null +++ b/helm-charts/xos-services/openstack/templates/_tosca.tpl @@ -0,0 +1,170 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{- define "openstack.flavorTosca" -}} +tosca_definitions_version: tosca_simple_yaml_1_0 + +imports: + - custom_types/flavor.yaml + +description: openstack flavor models + +topology_template: + node_templates: + + m1.tiny: + type: tosca.nodes.Flavor + properties: + name: m1.tiny + flavor: m1.tiny + + m1.small: + type: tosca.nodes.Flavor + properties: + name: m1.small + flavor: m1.small + + m1.medium: + type: tosca.nodes.Flavor + properties: + name: m1.medium + flavor: m1.medium + + m1.large: + type: tosca.nodes.Flavor + properties: + name: m1.large + flavor: m1.large + + m1.xlarge: + type: tosca.nodes.Flavor + properties: + name: m1.xlarge + flavor: m1.xlarge +{{- end -}} + +{{- define "openstack.networkTosca" -}} +tosca_definitions_version: tosca_simple_yaml_1_0 + +imports: + - custom_types/network.yaml + - custom_types/networktemplate.yaml + - custom_types/site.yaml + - custom_types/slice.yaml + +description: openstack flavor models + +topology_template: + node_templates: + + {{ .cordSiteName }}: + type: tosca.nodes.Site + properties: + name: {{ .cordSiteName }} + must-exist: true + +# For private networks (e.g., per-slice) + private_template: + type: tosca.nodes.NetworkTemplate + properties: + name: Private + visibility: private + translation: none + vtn_kind: PRIVATE + +# management (vtn: MANAGEMENT_LOCAL) network + management_template: + type: tosca.nodes.NetworkTemplate + properties: + name: management_template + visibility: private + translation: none + vtn_kind: MANAGEMENT_LOCAL + + management: + type: tosca.nodes.Network + properties: + name: management + # ip_version: 4 + subnet: 172.27.0.0/24 + permit_all_slices: true + requirements: + - template: + node: management_template + relationship: tosca.relationships.BelongsToOne + - owner: + node: slice#{{ .cordSiteName }}_management + relationship: tosca.relationships.BelongsToOne + +# Slice to own management networks + slice#{{ .cordSiteName }}_management: + description: This slice exists solely to own the management network(s) + type: tosca.nodes.Slice + properties: + network: noauto + name: {{ .cordSiteName }}_management + requirements: + - site: + node: {{ .cordSiteName }} + relationship: tosca.relationships.BelongsToOne +{{- end -}} + +{{- define "openstack.controllerTosca" -}} +tosca_definitions_version: tosca_simple_yaml_1_0 + +imports: + - custom_types/controller.yaml + - custom_types/controllersite.yaml + - custom_types/deployment.yaml + - custom_types/site.yaml + - custom_types/sitedeployment.yaml + - custom_types/openstackservice.yaml + +description: openstack controller models + +topology_template: + node_templates: + + {{ .cordSiteName }}: + type: tosca.nodes.Site + properties: + name: {{ .cordSiteName }} + must-exist: true + + service#openstack: + type: tosca.nodes.OpenStackService + properties: + name: "OpenStack" + auth_url: http://keystone.openstack.svc.cluster.local/v3 + admin_user: {{ .keystoneAdminUser }} + admin_password: {{ .keystoneAdminPassword }} + admin_tenant: {{ .keystoneAdminTenant }} + + # TODO: deal with the lack of controller objects + # TODO: All of this probably ends up in OpenStack service after the refactor +# {{ .cordSiteName }}_somedeployment_openstack: +# type: tosca.nodes.Controller +# properties: +# name: {{ .cordSiteName }}_somedeployment_openstack +# backend_type: OpenStack +# version: Newton +# auth_url: http://keystone.openstack.svc.cluster.local/v3 +# admin_user: {{ .keystoneAdminUser }} +# admin_password: {{ .keystoneAdminPassword }} +# admin_tenant: {{ .keystoneAdminTenant }} +# domain: {{ .keystoneDomain }} + +{{- end -}} diff --git a/helm-charts/xos-services/openstack/templates/configmap.yaml b/helm-charts/xos-services/openstack/templates/configmap.yaml new file mode 100644 index 0000000..db369de --- /dev/null +++ b/helm-charts/xos-services/openstack/templates/configmap.yaml @@ -0,0 +1,22 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: openstack +data: + serviceConfig: | +{{ include "openstack.serviceConfig" . | indent 4 }} diff --git a/helm-charts/xos-services/openstack/templates/deployment.yaml b/helm-charts/xos-services/openstack/templates/deployment.yaml new file mode 100644 index 0000000..0e94850 --- /dev/null +++ b/helm-charts/xos-services/openstack/templates/deployment.yaml @@ -0,0 +1,77 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: apps/v1beta2 +kind: Deployment +metadata: + name: {{ template "openstack.fullname" . }} + labels: + app: {{ template "openstack.name" . }} + chart: {{ template "openstack.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + app: {{ template "openstack.name" . }} + release: {{ .Release.Name }} + template: + metadata: + labels: + app: {{ template "openstack.name" . }} + release: {{ .Release.Name }} + annotations: + checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} + spec: + containers: + - name: {{ .Chart.Name }} + image: {{ .Values.global.registry }}{{ .Values.image.repository }}:{{ tpl .Values.image.tag . }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + resources: +{{ toYaml .Values.resources | indent 12 }} + volumeMounts: + - name: openstack-config + mountPath: /opt/xos/synchronizers/openstack/mounted_config.yaml + subPath: mounted_config.yaml + - name: certchain-volume + mountPath: /usr/local/share/ca-certificates/local_certs.crt + subPath: config/ca_cert_chain.pem + volumes: + - name: openstack-config + configMap: + name: openstack + items: + - key: serviceConfig + path: mounted_config.yaml + - name: certchain-volume + configMap: + name: ca-certificates + items: + - key: chain + path: config/ca_cert_chain.pem + {{- with .Values.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} diff --git a/helm-charts/xos-services/openstack/values.yaml b/helm-charts/xos-services/openstack/values.yaml new file mode 100644 index 0000000..e619da0 --- /dev/null +++ b/helm-charts/xos-services/openstack/values.yaml @@ -0,0 +1,44 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Default values for addressmanager. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +nameOverride: "" +fullnameOverride: "" + +imagePullPolicy: 'Always' + +image: + repository: xosproject/openstack-synchronizer + tag: "{{ .Chart.AppVersion }}" + pullPolicy: Always + +global: + registry: "" + +xosAdminUser: "admin@opencord.org" +xosAdminPassword: "letmein" + +resources: {} + +nodeSelector: {} + +tolerations: [] + +affinity: {} diff --git a/helm-charts/xos-services/progran/.helmignore b/helm-charts/xos-services/progran/.helmignore new file mode 100644 index 0000000..f0c1319 --- /dev/null +++ b/helm-charts/xos-services/progran/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/helm-charts/xos-services/progran/Chart.yaml b/helm-charts/xos-services/progran/Chart.yaml new file mode 100644 index 0000000..3c6a715 --- /dev/null +++ b/helm-charts/xos-services/progran/Chart.yaml @@ -0,0 +1,21 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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: progran +description: A Helm chart for XOS's "progran" service +icon: https://guide.opencord.org/logos/cord.svg + +version: 2.0.7 +appVersion: 2.0.5 diff --git a/helm-charts/xos-services/progran/templates/_helpers.tpl b/helm-charts/xos-services/progran/templates/_helpers.tpl new file mode 100644 index 0000000..6cd742a --- /dev/null +++ b/helm-charts/xos-services/progran/templates/_helpers.tpl @@ -0,0 +1,77 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{/* +Expand the name of the chart. +*/}} +{{- define "progran.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "progran.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "progran.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- define "progran.serviceConfig" -}} +name: progran +accessor: + username: {{ .Values.xosAdminUser | quote }} + password: {{ .Values.xosAdminPassword | quote }} + endpoint: xos-core:50051 +logging: + version: 1 + handlers: + console: + class: logging.StreamHandler + file: + class: logging.handlers.RotatingFileHandler + filename: /var/log/xos.log + maxBytes: 10485760 + backupCount: 5 + kafka: + class: kafkaloghandler.KafkaLogHandler + bootstrap_servers: + - "cord-kafka:9092" + topic: xos.log.progran + loggers: + '': + handlers: + - console + - file + - kafka + level: DEBUG +{{- end -}} diff --git a/helm-charts/xos-services/progran/templates/_tosca.tpl b/helm-charts/xos-services/progran/templates/_tosca.tpl new file mode 100644 index 0000000..f952daa --- /dev/null +++ b/helm-charts/xos-services/progran/templates/_tosca.tpl @@ -0,0 +1,34 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{- define "progran.serviceTosca" -}} +tosca_definitions_version: tosca_simple_yaml_1_0 + +imports: + - custom_types/progranservice.yaml + +description: Configures the progran service + +topology_template: + node_templates: + + service#progran: + type: tosca.nodes.ProgranService + properties: + name: progran + onos_address: onos-progran-ui + onos_port: "8181" +{{- end -}} diff --git a/helm-charts/xos-services/progran/templates/configmap.yaml b/helm-charts/xos-services/progran/templates/configmap.yaml new file mode 100644 index 0000000..1e295d5 --- /dev/null +++ b/helm-charts/xos-services/progran/templates/configmap.yaml @@ -0,0 +1,23 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: progran +data: + serviceConfig: | +{{ include "progran.serviceConfig" . | indent 4 }} diff --git a/helm-charts/xos-services/progran/templates/deployment.yaml b/helm-charts/xos-services/progran/templates/deployment.yaml new file mode 100644 index 0000000..e8600cc --- /dev/null +++ b/helm-charts/xos-services/progran/templates/deployment.yaml @@ -0,0 +1,76 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: apps/v1beta2 +kind: Deployment +metadata: + name: {{ template "progran.fullname" . }} + labels: + app: {{ template "progran.name" . }} + chart: {{ template "progran.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + app: {{ template "progran.name" . }} + release: {{ .Release.Name }} + template: + metadata: + labels: + app: {{ template "progran.name" . }} + release: {{ .Release.Name }} + annotations: + checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} + spec: + containers: + - name: {{ .Chart.Name }} + image: {{ .Values.global.registry }}{{ .Values.image.repository }}:{{ tpl .Values.image.tag . }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + resources: +{{ toYaml .Values.resources | indent 12 }} + volumeMounts: + - name: progran-config + mountPath: /opt/xos/synchronizers/progran/mounted_config.yaml + subPath: mounted_config.yaml + - name: certchain-volume + mountPath: /usr/local/share/ca-certificates/local_certs.crt + subPath: config/ca_cert_chain.pem + volumes: + - name: progran-config + configMap: + name: progran + items: + - key: serviceConfig + path: mounted_config.yaml + - name: certchain-volume + configMap: + name: ca-certificates + items: + - key: chain + path: config/ca_cert_chain.pem + {{- with .Values.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} diff --git a/helm-charts/xos-services/progran/values.yaml b/helm-charts/xos-services/progran/values.yaml new file mode 100644 index 0000000..c300941 --- /dev/null +++ b/helm-charts/xos-services/progran/values.yaml @@ -0,0 +1,42 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Default values for progran. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +nameOverride: "" +fullnameOverride: "" + +image: + repository: 'xosproject/progran-synchronizer' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + +global: + registry: '' + +xosAdminUser: "admin@opencord.org" +xosAdminPassword: "letmein" + +resources: {} + +nodeSelector: {} + +tolerations: [] + +affinity: {} diff --git a/helm-charts/xos-services/rcord/Chart.yaml b/helm-charts/xos-services/rcord/Chart.yaml new file mode 100644 index 0000000..431b568 --- /dev/null +++ b/helm-charts/xos-services/rcord/Chart.yaml @@ -0,0 +1,21 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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: rcord +description: A Helm chart for XOS's "rcord" service +icon: https://guide.opencord.org/logos/cord.svg + +version: 1.0.14 +appVersion: 1.1.0 diff --git a/helm-charts/xos-services/rcord/templates/_helpers.tpl b/helm-charts/xos-services/rcord/templates/_helpers.tpl new file mode 100644 index 0000000..2ce2d5f --- /dev/null +++ b/helm-charts/xos-services/rcord/templates/_helpers.tpl @@ -0,0 +1,73 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{/* +Expand the name of the chart. +*/}} +{{- define "rcord.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "rcord.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "rcord.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- define "rcord.serviceConfig" -}} +name: rcord +accessor: + username: {{ .Values.xosAdminUser | quote }} + password: {{ .Values.xosAdminPassword | quote }} + endpoint: {{ .Values.xosCoreService | quote }} +logging: + version: 1 + handlers: + console: + class: logging.StreamHandler + file: + class: logging.handlers.RotatingFileHandler + filename: /var/log/xos.log + maxBytes: 10485760 + backupCount: 5 + kafka: + class: kafkaloghandler.KafkaLogHandler + bootstrap_servers: + - "{{ .Values.kafkaService }}:9092" + topic: xos.log.rcord + loggers: + '': + handlers: + - console + - file + - kafka + level: DEBUG +{{- end -}} diff --git a/helm-charts/xos-services/rcord/templates/_tosca.tpl b/helm-charts/xos-services/rcord/templates/_tosca.tpl new file mode 100644 index 0000000..030d410 --- /dev/null +++ b/helm-charts/xos-services/rcord/templates/_tosca.tpl @@ -0,0 +1,29 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{- define "rcord.serviceTosca" -}} +tosca_definitions_version: tosca_simple_yaml_1_0 +imports: + - custom_types/rcordservice.yaml +description: R-CORD service TOSCA +topology_template: + node_templates: + service#rcord: + type: tosca.nodes.RCORDService + properties: + name: rcord + kind: data +{{- end -}} diff --git a/helm-charts/xos-services/rcord/templates/configmap.yaml b/helm-charts/xos-services/rcord/templates/configmap.yaml new file mode 100644 index 0000000..05b56dd --- /dev/null +++ b/helm-charts/xos-services/rcord/templates/configmap.yaml @@ -0,0 +1,22 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: rcord +data: + serviceConfig: | +{{ include "rcord.serviceConfig" . | indent 4 }} diff --git a/helm-charts/xos-services/rcord/templates/deployment.yaml b/helm-charts/xos-services/rcord/templates/deployment.yaml new file mode 100644 index 0000000..83b7720 --- /dev/null +++ b/helm-charts/xos-services/rcord/templates/deployment.yaml @@ -0,0 +1,77 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: apps/v1beta2 +kind: Deployment +metadata: + name: {{ template "rcord.fullname" . }} + labels: + app: {{ template "rcord.name" . }} + chart: {{ template "rcord.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + app: {{ template "rcord.name" . }} + release: {{ .Release.Name }} + template: + metadata: + labels: + app: {{ template "rcord.name" . }} + release: {{ .Release.Name }} + annotations: + checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} + spec: + containers: + - name: {{ .Chart.Name }} + image: {{ .Values.global.registry }}{{ .Values.image.repository }}:{{ tpl .Values.image.tag . }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + resources: +{{ toYaml .Values.resources | indent 12 }} + volumeMounts: + - name: rcord-config + mountPath: /opt/xos/synchronizers/rcord/mounted_config.yaml + subPath: mounted_config.yaml + - name: certchain-volume + mountPath: /usr/local/share/ca-certificates/local_certs.crt + subPath: config/ca_cert_chain.pem + volumes: + - name: rcord-config + configMap: + name: rcord + items: + - key: serviceConfig + path: mounted_config.yaml + - name: certchain-volume + configMap: + name: ca-certificates + items: + - key: chain + path: config/ca_cert_chain.pem + {{- with .Values.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} diff --git a/helm-charts/xos-services/rcord/values.yaml b/helm-charts/xos-services/rcord/values.yaml new file mode 100644 index 0000000..491b031 --- /dev/null +++ b/helm-charts/xos-services/rcord/values.yaml @@ -0,0 +1,45 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Default values for rcord +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +nameOverride: "" +fullnameOverride: "" + +image: + repository: 'xosproject/rcord-synchronizer' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + +global: + registry: "" + +xosAdminUser: "admin@opencord.org" +xosAdminPassword: "letmein" +xosCoreService: "xos-core:50051" + +kafkaService: "cord-kafka" + +resources: {} + +nodeSelector: {} + +tolerations: [] + +affinity: {} diff --git a/helm-charts/xos-services/sdncontroller/.helmignore b/helm-charts/xos-services/sdncontroller/.helmignore new file mode 100644 index 0000000..f0c1319 --- /dev/null +++ b/helm-charts/xos-services/sdncontroller/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/helm-charts/xos-services/sdncontroller/Chart.yaml b/helm-charts/xos-services/sdncontroller/Chart.yaml new file mode 100644 index 0000000..aa3c1a4 --- /dev/null +++ b/helm-charts/xos-services/sdncontroller/Chart.yaml @@ -0,0 +1,21 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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: sdncontroller +description: A Helm chart for XOS's "sdncontroller" service +icon: https://guide.opencord.org/logos/cord.svg + +version: 1.0.2 +appVersion: 1.0.2 diff --git a/helm-charts/xos-services/sdncontroller/files/id_rsa b/helm-charts/xos-services/sdncontroller/files/id_rsa new file mode 100644 index 0000000..c840002 --- /dev/null +++ b/helm-charts/xos-services/sdncontroller/files/id_rsa @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpgIBAAKCAQEAy+S+bw7ENW5knorMTH/xmRKr/OaBx7ukRRNe1WKEwLgQbB0J +xEznHG0E/OakgcuTQDACArTndeYl2H5rpdHhXkh6EK9R9yAF09In+gDcVzpvP2dq +5UTbYThILIw0FPX6DcUOMJLMoMuXqSpmxITKmxWY7o+M2H0rT8xP4JBUhPUI4SjF +miZsixX6vX/A5wvk0xONSuYhm7a2pq+6h0lrCisu+V1ejGWSyxRMa0KpWA5SwNld +GmHswqpd3wfeiiZn+hiUU9492O6Fmo+4BMzAsnANkID/GTRS/9kNaoL0EXOiOOvx +1IjodyE/C1Q3aNmVJ/aqzWpnkNc0e2vsAb2CFQIDAQABAoIBAQDGRZByCtf+ZXVv +PuXgVmKoSiH5cmYtxmi9y1JjCsSxa8x8ddhzjZ0IZXN+QwMiPMbamlS6MRUL71xK +JNWlkG0p9CzPYM3CFN/V1f2N/ZxHLsnTzEuE2+rBpat5tnVHFNOu5DsiPP7ENncq +x9Lbs44aNWxcQDfkpgOiO7pJU9D84FYuJbH6EhHCt1nuyUeHaG7qqsDYnaGo6NSc +qqnmrvoSBOQ+CIXgqRwGuetN9kNF/nKOWxWiZ+VAYIXb7cnkmOWTg5ojPifCWMeE +xiV9agFzEEJhPxhivFtIq0XvsiSlAZvZcREXKayw6zFx9JTgpOXYln+xg0pQEVXr +MLWv7BTZAoGBAPLy1Z7qjeR9PwTZen970AS3BsATQAcAh4aEHGPxwLmWDkhzJTW7 +C2U4dSyjB1W6OL6y4u7aggO5nshsEUZ73hE37b1/sr1PYC+NXuXuThDYDFD3f5LA +HwU0Xvx+uibV75+XpOkClSBkf2k6eBFD68PaLyjfCSnEkzukWPtngxRTAoGBANbY +zXFKIrcQtAz2p3+txU9Xqa5xK2rQfLurc66xxxC3KO8oMhYP2htieYRygwg91JR2 +Bu6sX8+t5MNYSso1t8CSO36tcgUDowo+2XuvY9FwQUgViHNKOb7cFrNSgWMVhbng +/ZgxKrnVl1NPBivDV5kPg+jD1BIOUlQimyrD6sL3AoGBAOnnRCZpWs1GjHrly5ub +n846TMR2hCl5qAGphg/vfIbxYrT8LzII8FK2xZGBMJmn3eQ0JGqkc5KUjrwV15gN +v+LB/yF4JaVAG7IMoPYstnpfF5SIhQnL8NG4906P0Dd9t+PmQz6XXu4987FjOqAc +zYvVr5vhCFhvSvWcKJN7uGbDAoGBAKvJequlLZDXCEB9UHzkwymn3IMg9ihYQAQH +GV6Lw7H34gEoULQXRLw0xxlCPsduOPXkUbKxnYJ/drVDebmprh2KT4wAv3SG7eyZ +SGh/Wv7yFSDAJvSYWwfjDzufMtm5Mc3oupzgY1toD7GLNFH1xasbHswVGRK+5NFl +QlC1ipcNAoGBAIxqGyCai6btwDlbpkdI+ck2j7k9ndZ8sosc0G2se9d58sfsHdWe +1wpqe62t7mQZr+IgEyq7RuuEtRR6Xqb8RQqAuEdSms1zcWc30SJJhPiwxIeLL0dx +ly/HBBqnozD4BN3ENiqnIhOgeZE7XHaS43luYkYpBOuBaWYs5IIZWcct +-----END RSA PRIVATE KEY----- diff --git a/helm-charts/xos-services/sdncontroller/templates/_helpers.tpl b/helm-charts/xos-services/sdncontroller/templates/_helpers.tpl new file mode 100644 index 0000000..ed66475 --- /dev/null +++ b/helm-charts/xos-services/sdncontroller/templates/_helpers.tpl @@ -0,0 +1,80 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{/* +Expand the name of the chart. +*/}} +{{- define "sdncontroller.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "sdncontroller.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "sdncontroller.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- define "sdncontroller.serviceConfig" -}} +name: sdncontroller +accessor: + username: {{ .Values.xosAdminUser | quote }} + password: {{ .Values.xosAdminPassword | quote }} + endpoint: xos-core:50051 +logging: + version: 1 + handlers: + console: + class: logging.StreamHandler + file: + class: logging.handlers.RotatingFileHandler + filename: /var/log/xos.log + maxBytes: 10485760 + backupCount: 5 + kafka: + class: kafkaloghandler.KafkaLogHandler + bootstrap_servers: + - "cord-kafka:9092" + topic: xos.log.sdncontroller + loggers: + '': + handlers: + - console + - file + - kafka + level: DEBUG +proxy_ssh: + enabled: {{ .Values.global.proxySshEnabled }} + user: {{ .Values.global.proxySshUser }} +{{- end -}} diff --git a/helm-charts/xos-services/sdncontroller/templates/_tosca.tpl b/helm-charts/xos-services/sdncontroller/templates/_tosca.tpl new file mode 100644 index 0000000..c08aa56 --- /dev/null +++ b/helm-charts/xos-services/sdncontroller/templates/_tosca.tpl @@ -0,0 +1,63 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{- define "sdncontroller.serviceTosca" -}} +tosca_definitions_version: tosca_simple_yaml_1_0 + +imports: + - custom_types/sdncontrollerservice.yaml + - custom_types/sdncontrollervendor.yaml + - custom_types/image.yaml + - custom_types/flavor.yaml + +description: Configures the sdncontroller service + +topology_template: + node_templates: + + service#sdncontroller: + type: tosca.nodes.SDNControllerService + properties: + name: sdncontroller + public_key: {{ .publicKey | quote }} + private_key_fn: /opt/xos/services/sdncontroller/keys/id_rsa + + intel_sdncontroller: + type: tosca.nodes.SDNControllerVendor + properties: + name: intel_sdncontroller_{{ .vnfImageVersion }} + requirements: + - image: + node: image_sdncontroller + relationship: tosca.relationships.BelongsToOne + - flavor: + node: {{ .vnfImageFlavor }} + relationship: tosca.relationships.BelongsToOne + + # This is a placeholder image right now... + image_sdncontroller: + type: tosca.nodes.Image + properties: + name: image_sdncontroller_{{ .vnfImageVersion }} + disk_format: QCOW2 + container_format: BARE + path: {{ .vnfImageURL }} + + {{ .vnfImageFlavor }}: + type: tosca.nodes.Flavor + properties: + name: {{ .vnfImageFlavor }} +{{- end -}} diff --git a/helm-charts/xos-services/sdncontroller/templates/configmap.yaml b/helm-charts/xos-services/sdncontroller/templates/configmap.yaml new file mode 100644 index 0000000..8fa526f --- /dev/null +++ b/helm-charts/xos-services/sdncontroller/templates/configmap.yaml @@ -0,0 +1,23 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: sdncontroller +data: + serviceConfig: | +{{ include "sdncontroller.serviceConfig" . | indent 4 }} diff --git a/helm-charts/xos-services/sdncontroller/templates/deployment.yaml b/helm-charts/xos-services/sdncontroller/templates/deployment.yaml new file mode 100644 index 0000000..2c886f2 --- /dev/null +++ b/helm-charts/xos-services/sdncontroller/templates/deployment.yaml @@ -0,0 +1,90 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: apps/v1beta2 +kind: Deployment +metadata: + name: {{ template "sdncontroller.fullname" . }} + labels: + app: {{ template "sdncontroller.name" . }} + chart: {{ template "sdncontroller.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + app: {{ template "sdncontroller.name" . }} + release: {{ .Release.Name }} + template: + metadata: + labels: + app: {{ template "sdncontroller.name" . }} + release: {{ .Release.Name }} + annotations: + checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} + spec: + containers: + - name: {{ .Chart.Name }} + image: {{ .Values.global.registry }}{{ .Values.image.repository }}:{{ tpl .Values.image.tag . }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + resources: +{{ toYaml .Values.resources | indent 12 }} + volumeMounts: + - name: sdncontroller-config + mountPath: /opt/xos/synchronizers/sdncontroller/mounted_config.yaml + subPath: mounted_config.yaml + - name: certchain-volume + mountPath: /usr/local/share/ca-certificates/local_certs.crt + subPath: config/ca_cert_chain.pem + - name: sdncontroller-keys + mountPath: /opt/xos/services/sdncontroller/keys + readOnly: true + - name: node-key + mountPath: /opt/cord_profile + readOnly: true + volumes: + - name: sdncontroller-config + configMap: + name: sdncontroller + items: + - key: serviceConfig + path: mounted_config.yaml + - name: certchain-volume + configMap: + name: ca-certificates + items: + - key: chain + path: config/ca_cert_chain.pem + - name: sdncontroller-keys + secret: + secretName: sdncontroller-keys + - name: node-key + secret: + secretName: node-key + defaultMode: 256 + optional: true + {{- with .Values.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} diff --git a/helm-charts/xos-services/sdncontroller/templates/secret.yaml b/helm-charts/xos-services/sdncontroller/templates/secret.yaml new file mode 100644 index 0000000..16af8b4 --- /dev/null +++ b/helm-charts/xos-services/sdncontroller/templates/secret.yaml @@ -0,0 +1,23 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Secret +metadata: + name: sdncontroller-keys + namespace: default +type: Opaque +data: + id_rsa: {{ .Files.Get .Values.privateKeyFile | b64enc }} \ No newline at end of file diff --git a/helm-charts/xos-services/sdncontroller/values.yaml b/helm-charts/xos-services/sdncontroller/values.yaml new file mode 100644 index 0000000..a9230ef --- /dev/null +++ b/helm-charts/xos-services/sdncontroller/values.yaml @@ -0,0 +1,52 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Default values for sdncontroller. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +nameOverride: "" +fullnameOverride: "" + +image: + repository: 'xosproject/sdncontroller-synchronizer' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + +xosAdminUser: "admin@opencord.org" +xosAdminPassword: "letmein" + +vnfImageURL: https://github.com/opencord/platform-install/releases/download/vms/trusty-server-cloudimg-amd64-disk1.img.20170201 +vnfImageVersion: "v0.1" +vnfImageFlavor: "m1.small" + +publicKey: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDL5L5vDsQ1bmSeisxMf/GZEqv85oHHu6RFE17VYoTAuBBsHQnETOccbQT85qSBy5NAMAICtOd15iXYfmul0eFeSHoQr1H3IAXT0if6ANxXOm8/Z2rlRNthOEgsjDQU9foNxQ4wksygy5epKmbEhMqbFZjuj4zYfStPzE/gkFSE9QjhKMWaJmyLFfq9f8DnC+TTE41K5iGbtramr7qHSWsKKy75XV6MZZLLFExrQqlYDlLA2V0aYezCql3fB96KJmf6GJRT3j3Y7oWaj7gEzMCycA2QgP8ZNFL/2Q1qgvQRc6I46/HUiOh3IT8LVDdo2ZUn9qrNameQ1zR7a+wBvYIV Insecure M-CORD keypair" +privateKeyFile: "files/id_rsa" + +# These variables can be overridden by the profile chart +global: + proxySshEnabled: true + proxySshUser: "root" + registry: '' + +resources: {} + +nodeSelector: {} + +tolerations: [] + +affinity: {} diff --git a/helm-charts/xos-services/simpleexampleservice/Chart.yaml b/helm-charts/xos-services/simpleexampleservice/Chart.yaml new file mode 100644 index 0000000..49e0c58 --- /dev/null +++ b/helm-charts/xos-services/simpleexampleservice/Chart.yaml @@ -0,0 +1,21 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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: simpleexampleservice +description: A Helm chart for XOS's "simpleexampleservice" service +icon: https://guide.opencord.org/logos/cord.svg + +version: 1.2.0 +appVersion: 1.2.1 diff --git a/helm-charts/xos-services/simpleexampleservice/templates/_helpers.tpl b/helm-charts/xos-services/simpleexampleservice/templates/_helpers.tpl new file mode 100644 index 0000000..db0137f --- /dev/null +++ b/helm-charts/xos-services/simpleexampleservice/templates/_helpers.tpl @@ -0,0 +1,81 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{/* +Expand the name of the chart. +*/}} +{{- define "simpleexampleservice.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "simpleexampleservice.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "simpleexampleservice.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- define "simpleexampleservice.serviceConfig" -}} +name: simpleexampleservice +desired_state: {{ .Values.desired_state | quote }} +accessor: + username: {{ .Values.xosAdminUser | quote }} + password: {{ .Values.xosAdminPassword | quote }} + endpoint: xos-core:50051 +event_bus: + endpoint: {{ .Values.kafkaService | quote }} + kind: kafka +logging: + version: 1 + handlers: + console: + class: logging.StreamHandler + file: + class: logging.handlers.RotatingFileHandler + filename: /var/log/xos.log + maxBytes: 10485760 + backupCount: 5 + kafka: + class: kafkaloghandler.KafkaLogHandler + bootstrap_servers: + - "cord-kafka:9092" + topic: xos.log.simpleexampleservice + loggers: + '': + handlers: + - console + - file + - kafka + level: DEBUG +{{- end -}} diff --git a/helm-charts/xos-services/simpleexampleservice/templates/_tosca.tpl b/helm-charts/xos-services/simpleexampleservice/templates/_tosca.tpl new file mode 100644 index 0000000..a71153e --- /dev/null +++ b/helm-charts/xos-services/simpleexampleservice/templates/_tosca.tpl @@ -0,0 +1,71 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{- define "simpleexampleservice.serviceTosca" -}} +tosca_definitions_version: tosca_simple_yaml_1_0 + +imports: + - custom_types/image.yaml + - custom_types/site.yaml + - custom_types/simpleexampleservice.yaml + - custom_types/slice.yaml + - custom_types/trustdomain.yaml + +description: Configures the simple example service + +topology_template: + node_templates: + + default_trustdomain: + type: tosca.nodes.TrustDomain + properties: + name: "default" + must-exist: true + + httpd_image: + type: tosca.nodes.Image + properties: + name: "httpd" + tag: "2.4" + + service#simpleexampleservice: + type: tosca.nodes.SimpleExampleService + properties: + name: simpleexampleservice + service_message: hello + mysite: + type: tosca.nodes.Site + properties: + name: "mysite" + must-exist: true + simpleexampleservice_slice: + type: tosca.nodes.Slice + properties: + name: "mysite_simpleexampleservice" + requirements: + - site: + node: mysite + relationship: tosca.relationships.BelongsToOne + - trust_domain: + node: default_trustdomain + relationship: tosca.relationships.BelongsToOne + - default_image: + node: httpd_image + relationship: tosca.relationships.BelongsToOne + - service: + node: service#simpleexampleservice + relationship: tosca.relationships.BelongsToOne +{{- end -}} diff --git a/helm-charts/xos-services/simpleexampleservice/templates/configmap.yaml b/helm-charts/xos-services/simpleexampleservice/templates/configmap.yaml new file mode 100644 index 0000000..ef13d3e --- /dev/null +++ b/helm-charts/xos-services/simpleexampleservice/templates/configmap.yaml @@ -0,0 +1,23 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: simpleexampleservice +data: + serviceConfig: | +{{ include "simpleexampleservice.serviceConfig" . | indent 4 }} diff --git a/helm-charts/xos-services/simpleexampleservice/templates/deployment.yaml b/helm-charts/xos-services/simpleexampleservice/templates/deployment.yaml new file mode 100644 index 0000000..976e54b --- /dev/null +++ b/helm-charts/xos-services/simpleexampleservice/templates/deployment.yaml @@ -0,0 +1,74 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: apps/v1beta2 +kind: Deployment +metadata: + name: {{ template "simpleexampleservice.fullname" . }} + labels: + app: {{ template "simpleexampleservice.name" . }} + chart: {{ template "simpleexampleservice.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + app: {{ template "simpleexampleservice.name" . }} + release: {{ .Release.Name }} + template: + metadata: + labels: + app: {{ template "simpleexampleservice.name" . }} + release: {{ .Release.Name }} + spec: + containers: + - name: {{ .Chart.Name }} + image: {{ .Values.global.registry }}{{ .Values.image.repository }}:{{ tpl .Values.image.tag . }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + resources: +{{ toYaml .Values.resources | indent 12 }} + volumeMounts: + - name: simpleexampleservice-config + mountPath: /opt/xos/synchronizers/simpleexampleservice/mounted_config.yaml + subPath: mounted_config.yaml + - name: certchain-volume + mountPath: /usr/local/share/ca-certificates/local_certs.crt + subPath: config/ca_cert_chain.pem + volumes: + - name: simpleexampleservice-config + configMap: + name: simpleexampleservice + items: + - key: serviceConfig + path: mounted_config.yaml + - name: certchain-volume + configMap: + name: ca-certificates + items: + - key: chain + path: config/ca_cert_chain.pem + {{- with .Values.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} diff --git a/helm-charts/xos-services/simpleexampleservice/values.yaml b/helm-charts/xos-services/simpleexampleservice/values.yaml new file mode 100644 index 0000000..101cca3 --- /dev/null +++ b/helm-charts/xos-services/simpleexampleservice/values.yaml @@ -0,0 +1,46 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Default values for simpleexampleservice. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +nameOverride: "" +fullnameOverride: "" + +image: + repository: 'xosproject/simpleexampleservice-synchronizer' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + +global: + registry: '' + +desired_state: load + +xosAdminUser: "admin@opencord.org" +xosAdminPassword: "letmein" + +kafkaService: "cord-kafka" + +resources: {} + +nodeSelector: {} + +tolerations: [] + +affinity: {} diff --git a/helm-charts/xos-services/tt-workflow-driver/.helmignore b/helm-charts/xos-services/tt-workflow-driver/.helmignore new file mode 100644 index 0000000..f0c1319 --- /dev/null +++ b/helm-charts/xos-services/tt-workflow-driver/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/helm-charts/xos-services/tt-workflow-driver/Chart.yaml b/helm-charts/xos-services/tt-workflow-driver/Chart.yaml new file mode 100644 index 0000000..2b98026 --- /dev/null +++ b/helm-charts/xos-services/tt-workflow-driver/Chart.yaml @@ -0,0 +1,21 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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: tt-workflow-driver +description: A Helm chart for XOS's "tt-workflow-driver" service +icon: https://guide.opencord.org/logos/cord.svg + +version: 0.1.0 +appVersion: 0.1.0 diff --git a/helm-charts/xos-services/tt-workflow-driver/templates/_helpers.tpl b/helm-charts/xos-services/tt-workflow-driver/templates/_helpers.tpl new file mode 100644 index 0000000..344fc5c --- /dev/null +++ b/helm-charts/xos-services/tt-workflow-driver/templates/_helpers.tpl @@ -0,0 +1,80 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{/* +Expand the name of the chart. +*/}} +{{- define "tt-workflow-driver.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "tt-workflow-driver.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "tt-workflow-driver.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- define "tt-workflow-driver.serviceConfig" -}} +name: tt-workflow-driver +accessor: + username: {{ .Values.xosAdminUser | quote }} + password: {{ .Values.xosAdminPassword | quote }} + endpoint: {{ .Values.xosCoreService | quote }} +event_bus: + endpoint: {{ .Values.kafkaService | quote }} + kind: kafka +logging: + version: 1 + handlers: + console: + class: logging.StreamHandler + file: + class: logging.handlers.RotatingFileHandler + filename: /var/log/xos.log + maxBytes: 10485760 + backupCount: 5 + kafka: + class: kafkaloghandler.KafkaLogHandler + bootstrap_servers: + - "{{ .Values.kafkaService }}:9092" + topic: xos.log.tt-workflow-driver + loggers: + '': + handlers: + - console + - file + - kafka + level: DEBUG +{{- end -}} diff --git a/helm-charts/xos-services/tt-workflow-driver/templates/_tosca.tpl b/helm-charts/xos-services/tt-workflow-driver/templates/_tosca.tpl new file mode 100644 index 0000000..1b3588d --- /dev/null +++ b/helm-charts/xos-services/tt-workflow-driver/templates/_tosca.tpl @@ -0,0 +1,30 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{- define "tt-workflow-driver.serviceTosca" -}} +tosca_definitions_version: tosca_simple_yaml_1_0 +description: Set up tt-workflow-driver service +imports: + - custom_types/ttworkflowdriverservice.yaml + +topology_template: + node_templates: + service#tt-workflow-driver: + type: tosca.nodes.TtWorkflowDriverService + properties: + name: tt-workflow-driver + kind: oss +{{- end -}} diff --git a/helm-charts/xos-services/tt-workflow-driver/templates/configmap.yaml b/helm-charts/xos-services/tt-workflow-driver/templates/configmap.yaml new file mode 100644 index 0000000..0035330 --- /dev/null +++ b/helm-charts/xos-services/tt-workflow-driver/templates/configmap.yaml @@ -0,0 +1,22 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: tt-workflow-driver +data: + serviceConfig: | +{{ include "tt-workflow-driver.serviceConfig" . | indent 4 }} diff --git a/helm-charts/xos-services/tt-workflow-driver/templates/deployment.yaml b/helm-charts/xos-services/tt-workflow-driver/templates/deployment.yaml new file mode 100644 index 0000000..1cdea92 --- /dev/null +++ b/helm-charts/xos-services/tt-workflow-driver/templates/deployment.yaml @@ -0,0 +1,77 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: apps/v1beta2 +kind: Deployment +metadata: + name: {{ template "tt-workflow-driver.fullname" . }} + labels: + app: {{ template "tt-workflow-driver.name" . }} + chart: {{ template "tt-workflow-driver.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + app: {{ template "tt-workflow-driver.name" . }} + release: {{ .Release.Name }} + template: + metadata: + labels: + app: {{ template "tt-workflow-driver.name" . }} + release: {{ .Release.Name }} + annotations: + checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} + spec: + containers: + - name: {{ .Chart.Name }} + image: {{ .Values.global.registry }}{{ .Values.image.repository }}:{{ tpl .Values.image.tag . }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + resources: +{{ toYaml .Values.resources | indent 12 }} + volumeMounts: + - name: tt-workflow-driver-config + mountPath: /opt/xos/synchronizers/tt-workflow-driver/mounted_config.yaml + subPath: mounted_config.yaml + - name: certchain-volume + mountPath: /usr/local/share/ca-certificates/local_certs.crt + subPath: config/ca_cert_chain.pem + volumes: + - name: tt-workflow-driver-config + configMap: + name: tt-workflow-driver + items: + - key: serviceConfig + path: mounted_config.yaml + - name: certchain-volume + configMap: + name: ca-certificates + items: + - key: chain + path: config/ca_cert_chain.pem + {{- with .Values.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} diff --git a/helm-charts/xos-services/tt-workflow-driver/values.yaml b/helm-charts/xos-services/tt-workflow-driver/values.yaml new file mode 100644 index 0000000..c8c1b83 --- /dev/null +++ b/helm-charts/xos-services/tt-workflow-driver/values.yaml @@ -0,0 +1,45 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Default values for the tt-workflow-driver service +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +nameOverride: "" +fullnameOverride: "" + +image: + repository: 'xosproject/tt-workflow-driver-synchronizer' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + +global: + registry: '' + +xosAdminUser: "admin@opencord.org" +xosAdminPassword: "letmein" +xosCoreService: "xos-core:50051" + +kafkaService: "cord-kafka" + +resources: {} + +nodeSelector: {} + +tolerations: [] + +affinity: {} diff --git a/helm-charts/xos-services/vhss/.helmignore b/helm-charts/xos-services/vhss/.helmignore new file mode 100644 index 0000000..f0c1319 --- /dev/null +++ b/helm-charts/xos-services/vhss/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/helm-charts/xos-services/vhss/Chart.yaml b/helm-charts/xos-services/vhss/Chart.yaml new file mode 100644 index 0000000..470473c --- /dev/null +++ b/helm-charts/xos-services/vhss/Chart.yaml @@ -0,0 +1,22 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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: vhss +description: A Helm chart for XOS's "vhss" service +icon: https://guide.opencord.org/logos/cord.svg + +version: 1.0.3 +appVersion: 1.0.3 + diff --git a/helm-charts/xos-services/vhss/files/id_rsa b/helm-charts/xos-services/vhss/files/id_rsa new file mode 100644 index 0000000..c840002 --- /dev/null +++ b/helm-charts/xos-services/vhss/files/id_rsa @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpgIBAAKCAQEAy+S+bw7ENW5knorMTH/xmRKr/OaBx7ukRRNe1WKEwLgQbB0J +xEznHG0E/OakgcuTQDACArTndeYl2H5rpdHhXkh6EK9R9yAF09In+gDcVzpvP2dq +5UTbYThILIw0FPX6DcUOMJLMoMuXqSpmxITKmxWY7o+M2H0rT8xP4JBUhPUI4SjF +miZsixX6vX/A5wvk0xONSuYhm7a2pq+6h0lrCisu+V1ejGWSyxRMa0KpWA5SwNld +GmHswqpd3wfeiiZn+hiUU9492O6Fmo+4BMzAsnANkID/GTRS/9kNaoL0EXOiOOvx +1IjodyE/C1Q3aNmVJ/aqzWpnkNc0e2vsAb2CFQIDAQABAoIBAQDGRZByCtf+ZXVv +PuXgVmKoSiH5cmYtxmi9y1JjCsSxa8x8ddhzjZ0IZXN+QwMiPMbamlS6MRUL71xK +JNWlkG0p9CzPYM3CFN/V1f2N/ZxHLsnTzEuE2+rBpat5tnVHFNOu5DsiPP7ENncq +x9Lbs44aNWxcQDfkpgOiO7pJU9D84FYuJbH6EhHCt1nuyUeHaG7qqsDYnaGo6NSc +qqnmrvoSBOQ+CIXgqRwGuetN9kNF/nKOWxWiZ+VAYIXb7cnkmOWTg5ojPifCWMeE +xiV9agFzEEJhPxhivFtIq0XvsiSlAZvZcREXKayw6zFx9JTgpOXYln+xg0pQEVXr +MLWv7BTZAoGBAPLy1Z7qjeR9PwTZen970AS3BsATQAcAh4aEHGPxwLmWDkhzJTW7 +C2U4dSyjB1W6OL6y4u7aggO5nshsEUZ73hE37b1/sr1PYC+NXuXuThDYDFD3f5LA +HwU0Xvx+uibV75+XpOkClSBkf2k6eBFD68PaLyjfCSnEkzukWPtngxRTAoGBANbY +zXFKIrcQtAz2p3+txU9Xqa5xK2rQfLurc66xxxC3KO8oMhYP2htieYRygwg91JR2 +Bu6sX8+t5MNYSso1t8CSO36tcgUDowo+2XuvY9FwQUgViHNKOb7cFrNSgWMVhbng +/ZgxKrnVl1NPBivDV5kPg+jD1BIOUlQimyrD6sL3AoGBAOnnRCZpWs1GjHrly5ub +n846TMR2hCl5qAGphg/vfIbxYrT8LzII8FK2xZGBMJmn3eQ0JGqkc5KUjrwV15gN +v+LB/yF4JaVAG7IMoPYstnpfF5SIhQnL8NG4906P0Dd9t+PmQz6XXu4987FjOqAc +zYvVr5vhCFhvSvWcKJN7uGbDAoGBAKvJequlLZDXCEB9UHzkwymn3IMg9ihYQAQH +GV6Lw7H34gEoULQXRLw0xxlCPsduOPXkUbKxnYJ/drVDebmprh2KT4wAv3SG7eyZ +SGh/Wv7yFSDAJvSYWwfjDzufMtm5Mc3oupzgY1toD7GLNFH1xasbHswVGRK+5NFl +QlC1ipcNAoGBAIxqGyCai6btwDlbpkdI+ck2j7k9ndZ8sosc0G2se9d58sfsHdWe +1wpqe62t7mQZr+IgEyq7RuuEtRR6Xqb8RQqAuEdSms1zcWc30SJJhPiwxIeLL0dx +ly/HBBqnozD4BN3ENiqnIhOgeZE7XHaS43luYkYpBOuBaWYs5IIZWcct +-----END RSA PRIVATE KEY----- diff --git a/helm-charts/xos-services/vhss/templates/_helpers.tpl b/helm-charts/xos-services/vhss/templates/_helpers.tpl new file mode 100644 index 0000000..6d8d47a --- /dev/null +++ b/helm-charts/xos-services/vhss/templates/_helpers.tpl @@ -0,0 +1,80 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{/* +Expand the name of the chart. +*/}} +{{- define "vhss.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "vhss.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "vhss.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- define "vhss.serviceConfig" -}} +name: vhss +accessor: + username: {{ .Values.xosAdminUser | quote }} + password: {{ .Values.xosAdminPassword | quote }} + endpoint: xos-core:50051 +logging: + version: 1 + handlers: + console: + class: logging.StreamHandler + file: + class: logging.handlers.RotatingFileHandler + filename: /var/log/xos.log + maxBytes: 10485760 + backupCount: 5 + kafka: + class: kafkaloghandler.KafkaLogHandler + bootstrap_servers: + - "cord-kafka:9092" + topic: xos.log.vhss + loggers: + '': + handlers: + - console + - file + - kafka + level: DEBUG +proxy_ssh: + enabled: {{ .Values.global.proxySshEnabled }} + user: {{ .Values.global.proxySshUser }} +{{- end -}} diff --git a/helm-charts/xos-services/vhss/templates/_tosca.tpl b/helm-charts/xos-services/vhss/templates/_tosca.tpl new file mode 100644 index 0000000..547ab9c --- /dev/null +++ b/helm-charts/xos-services/vhss/templates/_tosca.tpl @@ -0,0 +1,62 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{- define "vhss.serviceTosca" -}} +tosca_definitions_version: tosca_simple_yaml_1_0 + +imports: + - custom_types/vhssservice.yaml + - custom_types/vhssvendor.yaml + - custom_types/flavor.yaml + - custom_types/image.yaml + +description: Configures the vHSS service + +topology_template: + node_templates: + + service#vhss: + type: tosca.nodes.VHSSService + properties: + name: vhss + public_key: {{ .publicKey | quote }} + private_key_fn: /opt/xos/services/vhss/keys/id_rsa + + sprint_hss: + type: tosca.nodes.VHSSVendor + properties: + name: sprint_hss_{{ .vnfImageVersion }} + requirements: + - image: + node: image_hss + relationship: tosca.relationships.BelongsToOne + - flavor: + node: {{ .vnfImageFlavor }} + relationship: tosca.relationships.BelongsToOne + + image_hss: + type: tosca.nodes.Image + properties: + name: image_hss_{{ .vnfImageVersion }} + disk_format: QCOW2 + container_format: BARE + path: {{ .vnfImageURL }} + + {{ .vnfImageFlavor }}: + type: tosca.nodes.Flavor + properties: + name: {{ .vnfImageFlavor }} +{{- end -}} diff --git a/helm-charts/xos-services/vhss/templates/configmap.yaml b/helm-charts/xos-services/vhss/templates/configmap.yaml new file mode 100644 index 0000000..44d6396 --- /dev/null +++ b/helm-charts/xos-services/vhss/templates/configmap.yaml @@ -0,0 +1,23 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: vhss +data: + serviceConfig: | +{{ include "vhss.serviceConfig" . | indent 4 }} diff --git a/helm-charts/xos-services/vhss/templates/deployment.yaml b/helm-charts/xos-services/vhss/templates/deployment.yaml new file mode 100644 index 0000000..81fd874 --- /dev/null +++ b/helm-charts/xos-services/vhss/templates/deployment.yaml @@ -0,0 +1,90 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: apps/v1beta2 +kind: Deployment +metadata: + name: {{ template "vhss.fullname" . }} + labels: + app: {{ template "vhss.name" . }} + chart: {{ template "vhss.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + app: {{ template "vhss.name" . }} + release: {{ .Release.Name }} + template: + metadata: + labels: + app: {{ template "vhss.name" . }} + release: {{ .Release.Name }} + annotations: + checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} + spec: + containers: + - name: {{ .Chart.Name }} + image: {{ .Values.global.registry }}{{ .Values.image.repository }}:{{ tpl .Values.image.tag . }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + resources: +{{ toYaml .Values.resources | indent 12 }} + volumeMounts: + - name: vhss-config + mountPath: /opt/xos/synchronizers/vhss/mounted_config.yaml + subPath: mounted_config.yaml + - name: certchain-volume + mountPath: /usr/local/share/ca-certificates/local_certs.crt + subPath: config/ca_cert_chain.pem + - name: vhss-keys + mountPath: /opt/xos/services/vhss/keys + readOnly: true + - name: node-key + mountPath: /opt/cord_profile + readOnly: true + volumes: + - name: vhss-config + configMap: + name: vhss + items: + - key: serviceConfig + path: mounted_config.yaml + - name: certchain-volume + configMap: + name: ca-certificates + items: + - key: chain + path: config/ca_cert_chain.pem + - name: vhss-keys + secret: + secretName: vhss-keys + - name: node-key + secret: + secretName: node-key + defaultMode: 256 + optional: true + {{- with .Values.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} diff --git a/helm-charts/xos-services/vhss/templates/secret.yaml b/helm-charts/xos-services/vhss/templates/secret.yaml new file mode 100644 index 0000000..fc74bb3 --- /dev/null +++ b/helm-charts/xos-services/vhss/templates/secret.yaml @@ -0,0 +1,23 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Secret +metadata: + name: vhss-keys + namespace: default +type: Opaque +data: + id_rsa: {{ .Files.Get .Values.privateKeyFile | b64enc }} \ No newline at end of file diff --git a/helm-charts/xos-services/vhss/values.yaml b/helm-charts/xos-services/vhss/values.yaml new file mode 100644 index 0000000..21a18e4 --- /dev/null +++ b/helm-charts/xos-services/vhss/values.yaml @@ -0,0 +1,52 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Default values for vhss. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +nameOverride: "" +fullnameOverride: "" + +image: + repository: 'xosproject/vhss-synchronizer' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + +xosAdminUser: "admin@opencord.org" +xosAdminPassword: "letmein" + +vnfImageURL: "https://github.com/opencord/vHSS/releases/download/vms/image-hss.qcow2.v0.1.1" +vnfImageVersion: "v0.1.1" +vnfImageFlavor: "m1.large" + +publicKey: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDL5L5vDsQ1bmSeisxMf/GZEqv85oHHu6RFE17VYoTAuBBsHQnETOccbQT85qSBy5NAMAICtOd15iXYfmul0eFeSHoQr1H3IAXT0if6ANxXOm8/Z2rlRNthOEgsjDQU9foNxQ4wksygy5epKmbEhMqbFZjuj4zYfStPzE/gkFSE9QjhKMWaJmyLFfq9f8DnC+TTE41K5iGbtramr7qHSWsKKy75XV6MZZLLFExrQqlYDlLA2V0aYezCql3fB96KJmf6GJRT3j3Y7oWaj7gEzMCycA2QgP8ZNFL/2Q1qgvQRc6I46/HUiOh3IT8LVDdo2ZUn9qrNameQ1zR7a+wBvYIV Insecure M-CORD keypair" +privateKeyFile: "files/id_rsa" + +# These variables can be overridden by the profile chart +global: + proxySshEnabled: true + proxySshUser: "root" + registry: '' + +resources: {} + +nodeSelector: {} + +tolerations: [] + +affinity: {} diff --git a/helm-charts/xos-services/vmme/.helmignore b/helm-charts/xos-services/vmme/.helmignore new file mode 100644 index 0000000..f0c1319 --- /dev/null +++ b/helm-charts/xos-services/vmme/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/helm-charts/xos-services/vmme/Chart.yaml b/helm-charts/xos-services/vmme/Chart.yaml new file mode 100644 index 0000000..b5746e0 --- /dev/null +++ b/helm-charts/xos-services/vmme/Chart.yaml @@ -0,0 +1,22 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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: vmme +description: A Helm chart for XOS's "vmme" service +icon: https://guide.opencord.org/logos/cord.svg + +version: 1.0.3 +appVersion: 1.0.3 + diff --git a/helm-charts/xos-services/vmme/files/id_rsa b/helm-charts/xos-services/vmme/files/id_rsa new file mode 100644 index 0000000..c840002 --- /dev/null +++ b/helm-charts/xos-services/vmme/files/id_rsa @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpgIBAAKCAQEAy+S+bw7ENW5knorMTH/xmRKr/OaBx7ukRRNe1WKEwLgQbB0J +xEznHG0E/OakgcuTQDACArTndeYl2H5rpdHhXkh6EK9R9yAF09In+gDcVzpvP2dq +5UTbYThILIw0FPX6DcUOMJLMoMuXqSpmxITKmxWY7o+M2H0rT8xP4JBUhPUI4SjF +miZsixX6vX/A5wvk0xONSuYhm7a2pq+6h0lrCisu+V1ejGWSyxRMa0KpWA5SwNld +GmHswqpd3wfeiiZn+hiUU9492O6Fmo+4BMzAsnANkID/GTRS/9kNaoL0EXOiOOvx +1IjodyE/C1Q3aNmVJ/aqzWpnkNc0e2vsAb2CFQIDAQABAoIBAQDGRZByCtf+ZXVv +PuXgVmKoSiH5cmYtxmi9y1JjCsSxa8x8ddhzjZ0IZXN+QwMiPMbamlS6MRUL71xK +JNWlkG0p9CzPYM3CFN/V1f2N/ZxHLsnTzEuE2+rBpat5tnVHFNOu5DsiPP7ENncq +x9Lbs44aNWxcQDfkpgOiO7pJU9D84FYuJbH6EhHCt1nuyUeHaG7qqsDYnaGo6NSc +qqnmrvoSBOQ+CIXgqRwGuetN9kNF/nKOWxWiZ+VAYIXb7cnkmOWTg5ojPifCWMeE +xiV9agFzEEJhPxhivFtIq0XvsiSlAZvZcREXKayw6zFx9JTgpOXYln+xg0pQEVXr +MLWv7BTZAoGBAPLy1Z7qjeR9PwTZen970AS3BsATQAcAh4aEHGPxwLmWDkhzJTW7 +C2U4dSyjB1W6OL6y4u7aggO5nshsEUZ73hE37b1/sr1PYC+NXuXuThDYDFD3f5LA +HwU0Xvx+uibV75+XpOkClSBkf2k6eBFD68PaLyjfCSnEkzukWPtngxRTAoGBANbY +zXFKIrcQtAz2p3+txU9Xqa5xK2rQfLurc66xxxC3KO8oMhYP2htieYRygwg91JR2 +Bu6sX8+t5MNYSso1t8CSO36tcgUDowo+2XuvY9FwQUgViHNKOb7cFrNSgWMVhbng +/ZgxKrnVl1NPBivDV5kPg+jD1BIOUlQimyrD6sL3AoGBAOnnRCZpWs1GjHrly5ub +n846TMR2hCl5qAGphg/vfIbxYrT8LzII8FK2xZGBMJmn3eQ0JGqkc5KUjrwV15gN +v+LB/yF4JaVAG7IMoPYstnpfF5SIhQnL8NG4906P0Dd9t+PmQz6XXu4987FjOqAc +zYvVr5vhCFhvSvWcKJN7uGbDAoGBAKvJequlLZDXCEB9UHzkwymn3IMg9ihYQAQH +GV6Lw7H34gEoULQXRLw0xxlCPsduOPXkUbKxnYJ/drVDebmprh2KT4wAv3SG7eyZ +SGh/Wv7yFSDAJvSYWwfjDzufMtm5Mc3oupzgY1toD7GLNFH1xasbHswVGRK+5NFl +QlC1ipcNAoGBAIxqGyCai6btwDlbpkdI+ck2j7k9ndZ8sosc0G2se9d58sfsHdWe +1wpqe62t7mQZr+IgEyq7RuuEtRR6Xqb8RQqAuEdSms1zcWc30SJJhPiwxIeLL0dx +ly/HBBqnozD4BN3ENiqnIhOgeZE7XHaS43luYkYpBOuBaWYs5IIZWcct +-----END RSA PRIVATE KEY----- diff --git a/helm-charts/xos-services/vmme/templates/_helpers.tpl b/helm-charts/xos-services/vmme/templates/_helpers.tpl new file mode 100644 index 0000000..75e9931 --- /dev/null +++ b/helm-charts/xos-services/vmme/templates/_helpers.tpl @@ -0,0 +1,80 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{/* +Expand the name of the chart. +*/}} +{{- define "vmme.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "vmme.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "vmme.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- define "vmme.serviceConfig" -}} +name: vmme +accessor: + username: {{ .Values.xosAdminUser | quote }} + password: {{ .Values.xosAdminPassword | quote }} + endpoint: xos-core:50051 +logging: + version: 1 + handlers: + console: + class: logging.StreamHandler + file: + class: logging.handlers.RotatingFileHandler + filename: /var/log/xos.log + maxBytes: 10485760 + backupCount: 5 + kafka: + class: kafkaloghandler.KafkaLogHandler + bootstrap_servers: + - "cord-kafka:9092" + topic: xos.log.vmme + loggers: + '': + handlers: + - console + - file + - kafka + level: DEBUG +proxy_ssh: + enabled: {{ .Values.global.proxySshEnabled }} + user: {{ .Values.global.proxySshUser }} +{{- end -}} diff --git a/helm-charts/xos-services/vmme/templates/_tosca.tpl b/helm-charts/xos-services/vmme/templates/_tosca.tpl new file mode 100644 index 0000000..0b644fc --- /dev/null +++ b/helm-charts/xos-services/vmme/templates/_tosca.tpl @@ -0,0 +1,62 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{- define "vmme.serviceTosca" -}} +tosca_definitions_version: tosca_simple_yaml_1_0 + +imports: + - custom_types/vmmeservice.yaml + - custom_types/vmmevendor.yaml + - custom_types/flavor.yaml + - custom_types/image.yaml + +description: Configures the vMME service + +topology_template: + node_templates: + + service#vmme: + type: tosca.nodes.VMMEService + properties: + name: vmme + public_key: {{ .publicKey | quote }} + private_key_fn: /opt/xos/services/vmme/keys/id_rsa + + sprint_mme: + type: tosca.nodes.VMMEVendor + properties: + name: sprint_mme_{{ .vnfImageVersion }} + requirements: + - image: + node: image_mme + relationship: tosca.relationships.BelongsToOne + - flavor: + node: {{ .vnfImageFlavor }} + relationship: tosca.relationships.BelongsToOne + + image_mme: + type: tosca.nodes.Image + properties: + name: image_mme_{{ .vnfImageVersion }} + disk_format: QCOW2 + container_format: BARE + path: {{ .vnfImageURL }} + + {{ .vnfImageFlavor }}: + type: tosca.nodes.Flavor + properties: + name: {{ .vnfImageFlavor }} +{{- end -}} diff --git a/helm-charts/xos-services/vmme/templates/configmap.yaml b/helm-charts/xos-services/vmme/templates/configmap.yaml new file mode 100644 index 0000000..0ce0a56 --- /dev/null +++ b/helm-charts/xos-services/vmme/templates/configmap.yaml @@ -0,0 +1,23 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: vmme +data: + serviceConfig: | +{{ include "vmme.serviceConfig" . | indent 4 }} diff --git a/helm-charts/xos-services/vmme/templates/deployment.yaml b/helm-charts/xos-services/vmme/templates/deployment.yaml new file mode 100644 index 0000000..e609c52 --- /dev/null +++ b/helm-charts/xos-services/vmme/templates/deployment.yaml @@ -0,0 +1,90 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: apps/v1beta2 +kind: Deployment +metadata: + name: {{ template "vmme.fullname" . }} + labels: + app: {{ template "vmme.name" . }} + chart: {{ template "vmme.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + app: {{ template "vmme.name" . }} + release: {{ .Release.Name }} + template: + metadata: + labels: + app: {{ template "vmme.name" . }} + release: {{ .Release.Name }} + annotations: + checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} + spec: + containers: + - name: {{ .Chart.Name }} + image: {{ .Values.global.registry }}{{ .Values.image.repository }}:{{ tpl .Values.image.tag . }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + resources: +{{ toYaml .Values.resources | indent 12 }} + volumeMounts: + - name: vmme-config + mountPath: /opt/xos/synchronizers/vmme/mounted_config.yaml + subPath: mounted_config.yaml + - name: certchain-volume + mountPath: /usr/local/share/ca-certificates/local_certs.crt + subPath: config/ca_cert_chain.pem + - name: vmme-keys + mountPath: /opt/xos/services/vmme/keys + readOnly: true + - name: node-key + mountPath: /opt/cord_profile + readOnly: true + volumes: + - name: vmme-config + configMap: + name: vmme + items: + - key: serviceConfig + path: mounted_config.yaml + - name: certchain-volume + configMap: + name: ca-certificates + items: + - key: chain + path: config/ca_cert_chain.pem + - name: vmme-keys + secret: + secretName: vmme-keys + - name: node-key + secret: + secretName: node-key + defaultMode: 256 + optional: true + {{- with .Values.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} diff --git a/helm-charts/xos-services/vmme/templates/secret.yaml b/helm-charts/xos-services/vmme/templates/secret.yaml new file mode 100644 index 0000000..aae354c --- /dev/null +++ b/helm-charts/xos-services/vmme/templates/secret.yaml @@ -0,0 +1,23 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Secret +metadata: + name: vmme-keys + namespace: default +type: Opaque +data: + id_rsa: {{ .Files.Get .Values.privateKeyFile | b64enc }} \ No newline at end of file diff --git a/helm-charts/xos-services/vmme/values.yaml b/helm-charts/xos-services/vmme/values.yaml new file mode 100644 index 0000000..2fc8801 --- /dev/null +++ b/helm-charts/xos-services/vmme/values.yaml @@ -0,0 +1,52 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Default values for vmme. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +nameOverride: "" +fullnameOverride: "" + +image: + repository: 'xosproject/vmme-synchronizer' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + +xosAdminUser: "admin@opencord.org" +xosAdminPassword: "letmein" + +vnfImageURL: "https://github.com/opencord/vMME/releases/download/vms/image-mme.qcow2.v0.1.1" +vnfImageVersion: "v0.1.1" +vnfImageFlavor: "m1.large" + +publicKey: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDL5L5vDsQ1bmSeisxMf/GZEqv85oHHu6RFE17VYoTAuBBsHQnETOccbQT85qSBy5NAMAICtOd15iXYfmul0eFeSHoQr1H3IAXT0if6ANxXOm8/Z2rlRNthOEgsjDQU9foNxQ4wksygy5epKmbEhMqbFZjuj4zYfStPzE/gkFSE9QjhKMWaJmyLFfq9f8DnC+TTE41K5iGbtramr7qHSWsKKy75XV6MZZLLFExrQqlYDlLA2V0aYezCql3fB96KJmf6GJRT3j3Y7oWaj7gEzMCycA2QgP8ZNFL/2Q1qgvQRc6I46/HUiOh3IT8LVDdo2ZUn9qrNameQ1zR7a+wBvYIV Insecure M-CORD keypair" +privateKeyFile: "files/id_rsa" + +# These variables can be overridden by the profile chart +global: + proxySshEnabled: true + proxySshUser: "root" + registry: '' + +resources: {} + +nodeSelector: {} + +tolerations: [] + +affinity: {} diff --git a/helm-charts/xos-services/volt/.helmignore b/helm-charts/xos-services/volt/.helmignore new file mode 100644 index 0000000..f0c1319 --- /dev/null +++ b/helm-charts/xos-services/volt/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/helm-charts/xos-services/volt/Chart.yaml b/helm-charts/xos-services/volt/Chart.yaml new file mode 100644 index 0000000..d78909c --- /dev/null +++ b/helm-charts/xos-services/volt/Chart.yaml @@ -0,0 +1,21 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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: volt +description: A Helm chart for XOS's "olt-service" service +icon: https://guide.opencord.org/logos/cord.svg + +version: 2.2.0 +appVersion: 2.2.1 diff --git a/helm-charts/xos-services/volt/templates/_helpers.tpl b/helm-charts/xos-services/volt/templates/_helpers.tpl new file mode 100644 index 0000000..68aad4c --- /dev/null +++ b/helm-charts/xos-services/volt/templates/_helpers.tpl @@ -0,0 +1,80 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{/* +Expand the name of the chart. +*/}} +{{- define "volt.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "volt.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "volt.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- define "volt.serviceConfig" -}} +name: volt +accessor: + username: {{ .Values.xosAdminUser | quote }} + password: {{ .Values.xosAdminPassword | quote }} + endpoint: {{ .Values.xosCoreService | quote }} +event_bus: + endpoint: {{ .Values.kafkaService | quote }} + kind: kafka +logging: + version: 1 + handlers: + console: + class: logging.StreamHandler + file: + class: logging.handlers.RotatingFileHandler + filename: /var/log/xos.log + maxBytes: 10485760 + backupCount: 5 + kafka: + class: kafkaloghandler.KafkaLogHandler + bootstrap_servers: + - "{{ .Values.kafkaService }}:9092" + topic: xos.log.volt + loggers: + '': + handlers: + - console + - file + - kafka + level: DEBUG +{{- end -}} diff --git a/helm-charts/xos-services/volt/templates/_tosca.tpl b/helm-charts/xos-services/volt/templates/_tosca.tpl new file mode 100644 index 0000000..9666e06 --- /dev/null +++ b/helm-charts/xos-services/volt/templates/_tosca.tpl @@ -0,0 +1,36 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{- define "volt.serviceTosca" -}} +tosca_definitions_version: tosca_simple_yaml_1_0 +description: Set up VOLT service +imports: + - custom_types/voltservice.yaml + +topology_template: + node_templates: + service#volt: + type: tosca.nodes.VOLTService + properties: + name: volt + kind: data + voltha_url: {{ .volthaRestService | quote }} + voltha_port: 8882 + onos_voltha_url: {{ .onosRestService | quote }} + onos_voltha_port: 8181 + onos_voltha_user: karaf + onos_voltha_pass: karaf +{{- end -}} diff --git a/helm-charts/xos-services/volt/templates/configmap.yaml b/helm-charts/xos-services/volt/templates/configmap.yaml new file mode 100644 index 0000000..37dbd8d --- /dev/null +++ b/helm-charts/xos-services/volt/templates/configmap.yaml @@ -0,0 +1,22 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: volt +data: + serviceConfig: | +{{ include "volt.serviceConfig" . | indent 4 }} diff --git a/helm-charts/xos-services/volt/templates/deployment.yaml b/helm-charts/xos-services/volt/templates/deployment.yaml new file mode 100644 index 0000000..dee6e15 --- /dev/null +++ b/helm-charts/xos-services/volt/templates/deployment.yaml @@ -0,0 +1,77 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: apps/v1beta2 +kind: Deployment +metadata: + name: {{ template "volt.fullname" . }} + labels: + app: {{ template "volt.name" . }} + chart: {{ template "volt.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + app: {{ template "volt.name" . }} + release: {{ .Release.Name }} + template: + metadata: + labels: + app: {{ template "volt.name" . }} + release: {{ .Release.Name }} + annotations: + checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} + spec: + containers: + - name: {{ .Chart.Name }} + image: {{ .Values.global.registry }}{{ .Values.image.repository }}:{{ tpl .Values.image.tag . }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + resources: +{{ toYaml .Values.resources | indent 12 }} + volumeMounts: + - name: volt-config + mountPath: /opt/xos/synchronizers/volt/mounted_config.yaml + subPath: mounted_config.yaml + - name: certchain-volume + mountPath: /usr/local/share/ca-certificates/local_certs.crt + subPath: config/ca_cert_chain.pem + volumes: + - name: volt-config + configMap: + name: volt + items: + - key: serviceConfig + path: mounted_config.yaml + - name: certchain-volume + configMap: + name: ca-certificates + items: + - key: chain + path: config/ca_cert_chain.pem + {{- with .Values.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} diff --git a/helm-charts/xos-services/volt/values.yaml b/helm-charts/xos-services/volt/values.yaml new file mode 100644 index 0000000..c91144c --- /dev/null +++ b/helm-charts/xos-services/volt/values.yaml @@ -0,0 +1,47 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Default values for vOLT +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +nameOverride: "" +fullnameOverride: "" + +image: + repository: 'xosproject/volt-synchronizer' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + +global: + registry: '' + +xosAdminUser: "admin@opencord.org" +xosAdminPassword: "letmein" +xosCoreService: "xos-core:50051" + +volthaRestService: "voltha.voltha.svc.cluster.local" +onosRestService: "onos-ui.default.svc.cluster.local" +kafkaService: "cord-kafka" + +resources: {} + +nodeSelector: {} + +tolerations: [] + +affinity: {} diff --git a/helm-charts/xos-services/vrouter/.helmignore b/helm-charts/xos-services/vrouter/.helmignore new file mode 100644 index 0000000..f0c1319 --- /dev/null +++ b/helm-charts/xos-services/vrouter/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/helm-charts/xos-services/vrouter/Chart.yaml b/helm-charts/xos-services/vrouter/Chart.yaml new file mode 100644 index 0000000..cf4eb0e --- /dev/null +++ b/helm-charts/xos-services/vrouter/Chart.yaml @@ -0,0 +1,21 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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: vrouter +description: A Helm chart for XOS's "vRouter" service +icon: https://guide.opencord.org/logos/cord.svg + +version: 2.1.0 +appVersion: 2.1.0 diff --git a/helm-charts/xos-services/vrouter/templates/_helpers.tpl b/helm-charts/xos-services/vrouter/templates/_helpers.tpl new file mode 100644 index 0000000..ae5e80b --- /dev/null +++ b/helm-charts/xos-services/vrouter/templates/_helpers.tpl @@ -0,0 +1,77 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{/* +Expand the name of the chart. +*/}} +{{- define "vrouter.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "vrouter.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "vrouter.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- define "vrouter.serviceConfig" -}} +name: vrouter +accessor: + username: {{ .Values.xosAdminUser | quote }} + password: {{ .Values.xosAdminPassword | quote }} + endpoint: xos-core:50051 +logging: + version: 1 + handlers: + console: + class: logging.StreamHandler + file: + class: logging.handlers.RotatingFileHandler + filename: /var/log/xos.log + maxBytes: 10485760 + backupCount: 5 + kafka: + class: kafkaloghandler.KafkaLogHandler + bootstrap_servers: + - "cord-kafka:9092" + topic: xos.log.vrouter + loggers: + '': + handlers: + - console + - file + - kafka + level: DEBUG +{{- end -}} diff --git a/helm-charts/xos-services/vrouter/templates/_tosca.tpl b/helm-charts/xos-services/vrouter/templates/_tosca.tpl new file mode 100644 index 0000000..e70c33d --- /dev/null +++ b/helm-charts/xos-services/vrouter/templates/_tosca.tpl @@ -0,0 +1,30 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{- define "vrouter.serviceTosca" -}} +tosca_definitions_version: tosca_simple_yaml_1_0 +description: Set up VRouter service +imports: + - custom_types/vrouterservice.yaml + +topology_template: + node_templates: + service#vrouter: + type: tosca.nodes.VRouterService + properties: + name: vrouter + kind: data +{{- end -}} diff --git a/helm-charts/xos-services/vrouter/templates/configmap.yaml b/helm-charts/xos-services/vrouter/templates/configmap.yaml new file mode 100644 index 0000000..82606b7 --- /dev/null +++ b/helm-charts/xos-services/vrouter/templates/configmap.yaml @@ -0,0 +1,23 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: vrouter +data: + serviceConfig: | +{{ include "vrouter.serviceConfig" . | indent 4 }} diff --git a/helm-charts/xos-services/vrouter/templates/deployment.yaml b/helm-charts/xos-services/vrouter/templates/deployment.yaml new file mode 100644 index 0000000..9cfcc8d --- /dev/null +++ b/helm-charts/xos-services/vrouter/templates/deployment.yaml @@ -0,0 +1,77 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: apps/v1beta2 +kind: Deployment +metadata: + name: {{ template "vrouter.fullname" . }} + labels: + app: {{ template "vrouter.name" . }} + chart: {{ template "vrouter.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + app: {{ template "vrouter.name" . }} + release: {{ .Release.Name }} + template: + metadata: + labels: + app: {{ template "vrouter.name" . }} + release: {{ .Release.Name }} + annotations: + checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} + spec: + containers: + - name: {{ .Chart.Name }} + image: {{ .Values.global.registry }}{{ .Values.image.repository }}:{{ tpl .Values.image.tag . }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + resources: +{{ toYaml .Values.resources | indent 12 }} + volumeMounts: + - name: vrouter-config + mountPath: /opt/xos/synchronizers/vrouter/mounted_config.yaml + subPath: mounted_config.yaml + - name: certchain-volume + mountPath: /usr/local/share/ca-certificates/local_certs.crt + subPath: config/ca_cert_chain.pem + volumes: + - name: vrouter-config + configMap: + name: vrouter + items: + - key: serviceConfig + path: mounted_config.yaml + - name: certchain-volume + configMap: + name: ca-certificates + items: + - key: chain + path: config/ca_cert_chain.pem + {{- with .Values.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} diff --git a/helm-charts/xos-services/vrouter/values.yaml b/helm-charts/xos-services/vrouter/values.yaml new file mode 100644 index 0000000..0bfd1cf --- /dev/null +++ b/helm-charts/xos-services/vrouter/values.yaml @@ -0,0 +1,43 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Default values for addressmanager. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +nameOverride: "" +fullnameOverride: "" + + +image: + repository: 'xosproject/vrouter-synchronizer' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + +global: + registry: '' + +xosAdminUser: "admin@opencord.org" +xosAdminPassword: "letmein" + +resources: {} + +nodeSelector: {} + +tolerations: [] + +affinity: {} diff --git a/helm-charts/xos-services/vsg-hw/Chart.yaml b/helm-charts/xos-services/vsg-hw/Chart.yaml new file mode 100644 index 0000000..812d4c1 --- /dev/null +++ b/helm-charts/xos-services/vsg-hw/Chart.yaml @@ -0,0 +1,21 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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: vsg-hw +description: A Helm chart for XOS's "vsg-hw" service +icon: https://guide.opencord.org/logos/cord.svg + +version: 1.1.0 +appVersion: 1.1.0 diff --git a/helm-charts/xos-services/vsg-hw/templates/_helpers.tpl b/helm-charts/xos-services/vsg-hw/templates/_helpers.tpl new file mode 100644 index 0000000..3f0a5ea --- /dev/null +++ b/helm-charts/xos-services/vsg-hw/templates/_helpers.tpl @@ -0,0 +1,77 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{/* +Expand the name of the chart. +*/}} +{{- define "vsg-hw.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "vsg-hw.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "vsg-hw.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- define "vsg-hw.serviceConfig" -}} +name: vsg-hw +accessor: + username: {{ .Values.xosAdminUser | quote }} + password: {{ .Values.xosAdminPassword | quote }} + endpoint: xos-core:50051 +logging: + version: 1 + handlers: + console: + class: logging.StreamHandler + file: + class: logging.handlers.RotatingFileHandler + filename: /var/log/xos.log + maxBytes: 10485760 + backupCount: 5 + kafka: + class: kafkaloghandler.KafkaLogHandler + bootstrap_servers: + - "cord-kafka:9092" + topic: xos.log.vsg-hw + loggers: + '': + handlers: + - console + - file + - kafka + level: DEBUG +{{- end -}} diff --git a/helm-charts/xos-services/vsg-hw/templates/_tosca.tpl b/helm-charts/xos-services/vsg-hw/templates/_tosca.tpl new file mode 100644 index 0000000..14975f8 --- /dev/null +++ b/helm-charts/xos-services/vsg-hw/templates/_tosca.tpl @@ -0,0 +1,30 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{- define "vsg-hw.serviceTosca" -}} +tosca_definitions_version: tosca_simple_yaml_1_0 +description: Set up VSG-HW service +imports: + - custom_types/vsghwservice.yaml + +topology_template: + node_templates: + service#vsg-hw: + type: tosca.nodes.VSGHWService + properties: + name: vsg-hw + kind: data +{{- end -}} diff --git a/helm-charts/xos-services/vsg-hw/templates/configmap.yaml b/helm-charts/xos-services/vsg-hw/templates/configmap.yaml new file mode 100644 index 0000000..6a109c8 --- /dev/null +++ b/helm-charts/xos-services/vsg-hw/templates/configmap.yaml @@ -0,0 +1,22 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: vsg-hw +data: + serviceConfig: | +{{ include "vsg-hw.serviceConfig" . | indent 4 }} diff --git a/helm-charts/xos-services/vsg-hw/templates/deployment.yaml b/helm-charts/xos-services/vsg-hw/templates/deployment.yaml new file mode 100644 index 0000000..696ba93 --- /dev/null +++ b/helm-charts/xos-services/vsg-hw/templates/deployment.yaml @@ -0,0 +1,76 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: apps/v1beta2 +kind: Deployment +metadata: + name: {{ template "vsg-hw.fullname" . }} + labels: + app: {{ template "vsg-hw.name" . }} + chart: {{ template "vsg-hw.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + app: {{ template "vsg-hw.name" . }} + release: {{ .Release.Name }} + template: + metadata: + labels: + app: {{ template "vsg-hw.name" . }} + release: {{ .Release.Name }} + annotations: + checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} + spec: + containers: + - name: {{ .Chart.Name }} + image: {{ .Values.global.registry }}{{ .Values.image.repository }}:{{ tpl .Values.image.tag . }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + resources: +{{ toYaml .Values.resources | indent 12 }} + volumeMounts: + - name: vsg-hw-config + mountPath: /opt/xos/synchronizers/vsg-hw/mounted_config.yaml + subPath: mounted_config.yaml + - name: certchain-volume + mountPath: /usr/local/share/ca-certificates/local_certs.crt + subPath: config/ca_cert_chain.pem + volumes: + - name: vsg-hw-config + configMap: + name: vsg-hw + items: + - key: serviceConfig + path: mounted_config.yaml + - name: certchain-volume + configMap: + name: ca-certificates + items: + - key: chain + path: config/ca_cert_chain.pem + {{- with .Values.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} diff --git a/helm-charts/xos-services/vsg-hw/values.yaml b/helm-charts/xos-services/vsg-hw/values.yaml new file mode 100644 index 0000000..5fe50a1 --- /dev/null +++ b/helm-charts/xos-services/vsg-hw/values.yaml @@ -0,0 +1,42 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Default values for vsg-hw +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +nameOverride: "" +fullnameOverride: "" + +image: + repository: 'xosproject/vsg-hw-synchronizer' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + +global: + registry: '' + +xosAdminUser: "admin@opencord.org" +xosAdminPassword: "letmein" + +resources: {} + +nodeSelector: {} + +tolerations: [] + +affinity: {} diff --git a/helm-charts/xos-services/vspgwc/.helmignore b/helm-charts/xos-services/vspgwc/.helmignore new file mode 100644 index 0000000..f0c1319 --- /dev/null +++ b/helm-charts/xos-services/vspgwc/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/helm-charts/xos-services/vspgwc/Chart.yaml b/helm-charts/xos-services/vspgwc/Chart.yaml new file mode 100644 index 0000000..c2cd4d4 --- /dev/null +++ b/helm-charts/xos-services/vspgwc/Chart.yaml @@ -0,0 +1,21 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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: vspgwc +description: A Helm chart for XOS's "vspgwc" service +icon: https://guide.opencord.org/logos/cord.svg + +version: 1.0.2 +appVersion: 1.0.2 diff --git a/helm-charts/xos-services/vspgwc/files/id_rsa b/helm-charts/xos-services/vspgwc/files/id_rsa new file mode 100644 index 0000000..c840002 --- /dev/null +++ b/helm-charts/xos-services/vspgwc/files/id_rsa @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpgIBAAKCAQEAy+S+bw7ENW5knorMTH/xmRKr/OaBx7ukRRNe1WKEwLgQbB0J +xEznHG0E/OakgcuTQDACArTndeYl2H5rpdHhXkh6EK9R9yAF09In+gDcVzpvP2dq +5UTbYThILIw0FPX6DcUOMJLMoMuXqSpmxITKmxWY7o+M2H0rT8xP4JBUhPUI4SjF +miZsixX6vX/A5wvk0xONSuYhm7a2pq+6h0lrCisu+V1ejGWSyxRMa0KpWA5SwNld +GmHswqpd3wfeiiZn+hiUU9492O6Fmo+4BMzAsnANkID/GTRS/9kNaoL0EXOiOOvx +1IjodyE/C1Q3aNmVJ/aqzWpnkNc0e2vsAb2CFQIDAQABAoIBAQDGRZByCtf+ZXVv +PuXgVmKoSiH5cmYtxmi9y1JjCsSxa8x8ddhzjZ0IZXN+QwMiPMbamlS6MRUL71xK +JNWlkG0p9CzPYM3CFN/V1f2N/ZxHLsnTzEuE2+rBpat5tnVHFNOu5DsiPP7ENncq +x9Lbs44aNWxcQDfkpgOiO7pJU9D84FYuJbH6EhHCt1nuyUeHaG7qqsDYnaGo6NSc +qqnmrvoSBOQ+CIXgqRwGuetN9kNF/nKOWxWiZ+VAYIXb7cnkmOWTg5ojPifCWMeE +xiV9agFzEEJhPxhivFtIq0XvsiSlAZvZcREXKayw6zFx9JTgpOXYln+xg0pQEVXr +MLWv7BTZAoGBAPLy1Z7qjeR9PwTZen970AS3BsATQAcAh4aEHGPxwLmWDkhzJTW7 +C2U4dSyjB1W6OL6y4u7aggO5nshsEUZ73hE37b1/sr1PYC+NXuXuThDYDFD3f5LA +HwU0Xvx+uibV75+XpOkClSBkf2k6eBFD68PaLyjfCSnEkzukWPtngxRTAoGBANbY +zXFKIrcQtAz2p3+txU9Xqa5xK2rQfLurc66xxxC3KO8oMhYP2htieYRygwg91JR2 +Bu6sX8+t5MNYSso1t8CSO36tcgUDowo+2XuvY9FwQUgViHNKOb7cFrNSgWMVhbng +/ZgxKrnVl1NPBivDV5kPg+jD1BIOUlQimyrD6sL3AoGBAOnnRCZpWs1GjHrly5ub +n846TMR2hCl5qAGphg/vfIbxYrT8LzII8FK2xZGBMJmn3eQ0JGqkc5KUjrwV15gN +v+LB/yF4JaVAG7IMoPYstnpfF5SIhQnL8NG4906P0Dd9t+PmQz6XXu4987FjOqAc +zYvVr5vhCFhvSvWcKJN7uGbDAoGBAKvJequlLZDXCEB9UHzkwymn3IMg9ihYQAQH +GV6Lw7H34gEoULQXRLw0xxlCPsduOPXkUbKxnYJ/drVDebmprh2KT4wAv3SG7eyZ +SGh/Wv7yFSDAJvSYWwfjDzufMtm5Mc3oupzgY1toD7GLNFH1xasbHswVGRK+5NFl +QlC1ipcNAoGBAIxqGyCai6btwDlbpkdI+ck2j7k9ndZ8sosc0G2se9d58sfsHdWe +1wpqe62t7mQZr+IgEyq7RuuEtRR6Xqb8RQqAuEdSms1zcWc30SJJhPiwxIeLL0dx +ly/HBBqnozD4BN3ENiqnIhOgeZE7XHaS43luYkYpBOuBaWYs5IIZWcct +-----END RSA PRIVATE KEY----- diff --git a/helm-charts/xos-services/vspgwc/templates/_helpers.tpl b/helm-charts/xos-services/vspgwc/templates/_helpers.tpl new file mode 100644 index 0000000..2649c11 --- /dev/null +++ b/helm-charts/xos-services/vspgwc/templates/_helpers.tpl @@ -0,0 +1,80 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{/* +Expand the name of the chart. +*/}} +{{- define "vspgwc.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "vspgwc.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "vspgwc.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- define "vspgwc.serviceConfig" -}} +name: vspgwc +accessor: + username: {{ .Values.xosAdminUser | quote }} + password: {{ .Values.xosAdminPassword | quote }} + endpoint: xos-core:50051 +logging: + version: 1 + handlers: + console: + class: logging.StreamHandler + file: + class: logging.handlers.RotatingFileHandler + filename: /var/log/xos.log + maxBytes: 10485760 + backupCount: 5 + kafka: + class: kafkaloghandler.KafkaLogHandler + bootstrap_servers: + - "cord-kafka:9092" + topic: xos.log.vspgwc + loggers: + '': + handlers: + - console + - file + - kafka + level: DEBUG +proxy_ssh: + enabled: {{ .Values.global.proxySshEnabled }} + user: {{ .Values.global.proxySshUser }} +{{- end -}} diff --git a/helm-charts/xos-services/vspgwc/templates/_tosca.tpl b/helm-charts/xos-services/vspgwc/templates/_tosca.tpl new file mode 100644 index 0000000..84cfaf7 --- /dev/null +++ b/helm-charts/xos-services/vspgwc/templates/_tosca.tpl @@ -0,0 +1,62 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{- define "vspgwc.serviceTosca" -}} +tosca_definitions_version: tosca_simple_yaml_1_0 + +imports: + - custom_types/vspgwcservice.yaml + - custom_types/vspgwcvendor.yaml + - custom_types/flavor.yaml + - custom_types/image.yaml + +description: Configures the vSPGWC service + +topology_template: + node_templates: + + service#vspgwc: + type: tosca.nodes.VSPGWCService + properties: + name: vspgwc + public_key: {{ .publicKey | quote }} + private_key_fn: /opt/xos/services/vspgwc/keys/id_rsa + + intel_vspgwc: + type: tosca.nodes.VSPGWCVendor + properties: + name: intel_vspgwc_{{ .vnfImageVersion }} + requirements: + - image: + node: image_spgwc + relationship: tosca.relationships.BelongsToOne + - flavor: + node: {{ .vnfImageFlavor }} + relationship: tosca.relationships.BelongsToOne + + image_spgwc: + type: tosca.nodes.Image + properties: + name: image_spgwc_{{ .vnfImageVersion }} + disk_format: QCOW2 + container_format: BARE + path: {{ .vnfImageURL }} + + {{ .vnfImageFlavor }}: + type: tosca.nodes.Flavor + properties: + name: {{ .vnfImageFlavor }} +{{- end -}} diff --git a/helm-charts/xos-services/vspgwc/templates/configmap.yaml b/helm-charts/xos-services/vspgwc/templates/configmap.yaml new file mode 100644 index 0000000..911e598 --- /dev/null +++ b/helm-charts/xos-services/vspgwc/templates/configmap.yaml @@ -0,0 +1,23 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: vspgwc +data: + serviceConfig: | +{{ include "vspgwc.serviceConfig" . | indent 4 }} diff --git a/helm-charts/xos-services/vspgwc/templates/deployment.yaml b/helm-charts/xos-services/vspgwc/templates/deployment.yaml new file mode 100644 index 0000000..76a517d --- /dev/null +++ b/helm-charts/xos-services/vspgwc/templates/deployment.yaml @@ -0,0 +1,90 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: apps/v1beta2 +kind: Deployment +metadata: + name: {{ template "vspgwc.fullname" . }} + labels: + app: {{ template "vspgwc.name" . }} + chart: {{ template "vspgwc.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + app: {{ template "vspgwc.name" . }} + release: {{ .Release.Name }} + template: + metadata: + labels: + app: {{ template "vspgwc.name" . }} + release: {{ .Release.Name }} + annotations: + checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} + spec: + containers: + - name: {{ .Chart.Name }} + image: {{ .Values.global.registry }}{{ .Values.image.repository }}:{{ tpl .Values.image.tag . }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + resources: +{{ toYaml .Values.resources | indent 12 }} + volumeMounts: + - name: vspgwc-config + mountPath: /opt/xos/synchronizers/vspgwc/mounted_config.yaml + subPath: mounted_config.yaml + - name: certchain-volume + mountPath: /usr/local/share/ca-certificates/local_certs.crt + subPath: config/ca_cert_chain.pem + - name: vspgwc-keys + mountPath: /opt/xos/services/vspgwc/keys + readOnly: true + - name: node-key + mountPath: /opt/cord_profile + readOnly: true + volumes: + - name: vspgwc-config + configMap: + name: vspgwc + items: + - key: serviceConfig + path: mounted_config.yaml + - name: certchain-volume + configMap: + name: ca-certificates + items: + - key: chain + path: config/ca_cert_chain.pem + - name: vspgwc-keys + secret: + secretName: vspgwc-keys + - name: node-key + secret: + secretName: node-key + defaultMode: 256 + optional: true + {{- with .Values.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} diff --git a/helm-charts/xos-services/vspgwc/templates/secret.yaml b/helm-charts/xos-services/vspgwc/templates/secret.yaml new file mode 100644 index 0000000..18a6093 --- /dev/null +++ b/helm-charts/xos-services/vspgwc/templates/secret.yaml @@ -0,0 +1,23 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Secret +metadata: + name: vspgwc-keys + namespace: default +type: Opaque +data: + id_rsa: {{ .Files.Get .Values.privateKeyFile | b64enc }} \ No newline at end of file diff --git a/helm-charts/xos-services/vspgwc/values.yaml b/helm-charts/xos-services/vspgwc/values.yaml new file mode 100644 index 0000000..8fca902 --- /dev/null +++ b/helm-charts/xos-services/vspgwc/values.yaml @@ -0,0 +1,52 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Default values for vspgwc. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +nameOverride: "" +fullnameOverride: "" + +image: + repository: 'xosproject/vspgwc-synchronizer' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + +xosAdminUser: "admin@opencord.org" +xosAdminPassword: "letmein" + +vnfImageURL: "https://github.com/opencord/vspgwc/releases/download/vms/image-spgwc.qcow2.v0.1.1" +vnfImageVersion: "v0.1.1" +vnfImageFlavor: "m1.large" + +publicKey: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDL5L5vDsQ1bmSeisxMf/GZEqv85oHHu6RFE17VYoTAuBBsHQnETOccbQT85qSBy5NAMAICtOd15iXYfmul0eFeSHoQr1H3IAXT0if6ANxXOm8/Z2rlRNthOEgsjDQU9foNxQ4wksygy5epKmbEhMqbFZjuj4zYfStPzE/gkFSE9QjhKMWaJmyLFfq9f8DnC+TTE41K5iGbtramr7qHSWsKKy75XV6MZZLLFExrQqlYDlLA2V0aYezCql3fB96KJmf6GJRT3j3Y7oWaj7gEzMCycA2QgP8ZNFL/2Q1qgvQRc6I46/HUiOh3IT8LVDdo2ZUn9qrNameQ1zR7a+wBvYIV Insecure M-CORD keypair" +privateKeyFile: "files/id_rsa" + +# These variables can be overridden by the profile chart +global: + proxySshEnabled: true + proxySshUser: "root" + registry: '' + +resources: {} + +nodeSelector: {} + +tolerations: [] + +affinity: {} diff --git a/helm-charts/xos-services/vspgwu/.helmignore b/helm-charts/xos-services/vspgwu/.helmignore new file mode 100644 index 0000000..f0c1319 --- /dev/null +++ b/helm-charts/xos-services/vspgwu/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/helm-charts/xos-services/vspgwu/Chart.yaml b/helm-charts/xos-services/vspgwu/Chart.yaml new file mode 100644 index 0000000..288fbfa --- /dev/null +++ b/helm-charts/xos-services/vspgwu/Chart.yaml @@ -0,0 +1,21 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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: vspgwu +description: A Helm chart for XOS's "vspgwu" service +icon: https://guide.opencord.org/logos/cord.svg + +version: 1.0.2 +appVersion: 1.0.2 diff --git a/helm-charts/xos-services/vspgwu/files/id_rsa b/helm-charts/xos-services/vspgwu/files/id_rsa new file mode 100644 index 0000000..c840002 --- /dev/null +++ b/helm-charts/xos-services/vspgwu/files/id_rsa @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpgIBAAKCAQEAy+S+bw7ENW5knorMTH/xmRKr/OaBx7ukRRNe1WKEwLgQbB0J +xEznHG0E/OakgcuTQDACArTndeYl2H5rpdHhXkh6EK9R9yAF09In+gDcVzpvP2dq +5UTbYThILIw0FPX6DcUOMJLMoMuXqSpmxITKmxWY7o+M2H0rT8xP4JBUhPUI4SjF +miZsixX6vX/A5wvk0xONSuYhm7a2pq+6h0lrCisu+V1ejGWSyxRMa0KpWA5SwNld +GmHswqpd3wfeiiZn+hiUU9492O6Fmo+4BMzAsnANkID/GTRS/9kNaoL0EXOiOOvx +1IjodyE/C1Q3aNmVJ/aqzWpnkNc0e2vsAb2CFQIDAQABAoIBAQDGRZByCtf+ZXVv +PuXgVmKoSiH5cmYtxmi9y1JjCsSxa8x8ddhzjZ0IZXN+QwMiPMbamlS6MRUL71xK +JNWlkG0p9CzPYM3CFN/V1f2N/ZxHLsnTzEuE2+rBpat5tnVHFNOu5DsiPP7ENncq +x9Lbs44aNWxcQDfkpgOiO7pJU9D84FYuJbH6EhHCt1nuyUeHaG7qqsDYnaGo6NSc +qqnmrvoSBOQ+CIXgqRwGuetN9kNF/nKOWxWiZ+VAYIXb7cnkmOWTg5ojPifCWMeE +xiV9agFzEEJhPxhivFtIq0XvsiSlAZvZcREXKayw6zFx9JTgpOXYln+xg0pQEVXr +MLWv7BTZAoGBAPLy1Z7qjeR9PwTZen970AS3BsATQAcAh4aEHGPxwLmWDkhzJTW7 +C2U4dSyjB1W6OL6y4u7aggO5nshsEUZ73hE37b1/sr1PYC+NXuXuThDYDFD3f5LA +HwU0Xvx+uibV75+XpOkClSBkf2k6eBFD68PaLyjfCSnEkzukWPtngxRTAoGBANbY +zXFKIrcQtAz2p3+txU9Xqa5xK2rQfLurc66xxxC3KO8oMhYP2htieYRygwg91JR2 +Bu6sX8+t5MNYSso1t8CSO36tcgUDowo+2XuvY9FwQUgViHNKOb7cFrNSgWMVhbng +/ZgxKrnVl1NPBivDV5kPg+jD1BIOUlQimyrD6sL3AoGBAOnnRCZpWs1GjHrly5ub +n846TMR2hCl5qAGphg/vfIbxYrT8LzII8FK2xZGBMJmn3eQ0JGqkc5KUjrwV15gN +v+LB/yF4JaVAG7IMoPYstnpfF5SIhQnL8NG4906P0Dd9t+PmQz6XXu4987FjOqAc +zYvVr5vhCFhvSvWcKJN7uGbDAoGBAKvJequlLZDXCEB9UHzkwymn3IMg9ihYQAQH +GV6Lw7H34gEoULQXRLw0xxlCPsduOPXkUbKxnYJ/drVDebmprh2KT4wAv3SG7eyZ +SGh/Wv7yFSDAJvSYWwfjDzufMtm5Mc3oupzgY1toD7GLNFH1xasbHswVGRK+5NFl +QlC1ipcNAoGBAIxqGyCai6btwDlbpkdI+ck2j7k9ndZ8sosc0G2se9d58sfsHdWe +1wpqe62t7mQZr+IgEyq7RuuEtRR6Xqb8RQqAuEdSms1zcWc30SJJhPiwxIeLL0dx +ly/HBBqnozD4BN3ENiqnIhOgeZE7XHaS43luYkYpBOuBaWYs5IIZWcct +-----END RSA PRIVATE KEY----- diff --git a/helm-charts/xos-services/vspgwu/templates/_helpers.tpl b/helm-charts/xos-services/vspgwu/templates/_helpers.tpl new file mode 100644 index 0000000..feecce1 --- /dev/null +++ b/helm-charts/xos-services/vspgwu/templates/_helpers.tpl @@ -0,0 +1,103 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{/* +Expand the name of the chart. +*/}} +{{- define "vspgwu.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "vspgwu.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "vspgwu.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- define "vspgwu.serviceConfig" -}} +name: vspgwu +accessor: + username: {{ .Values.xosAdminUser | quote }} + password: {{ .Values.xosAdminPassword | quote }} + endpoint: xos-core:50051 +logging: + version: 1 + handlers: + console: + class: logging.StreamHandler + file: + class: logging.handlers.RotatingFileHandler + filename: /var/log/xos.log + maxBytes: 10485760 + backupCount: 5 + kafka: + class: kafkaloghandler.KafkaLogHandler + bootstrap_servers: + - "cord-kafka:9092" + topic: xos.log.vspgwu + loggers: + '': + handlers: + - console + - file + - kafka + level: DEBUG +blueprints: + - name: cord_5_0_blueprint + graph: + - name: VMMETenant + - name: VSPGWCTenant + links: + - name: VMMETenant + - name: VSPGWUTenant + - name: VSPGWUTenant + - name: VHSSTenant + links: + - name: HSSDBServiceInstance + - name: HSSDBServiceInstance + - name: cord_4_1_blueprint + graph: + - name: VSPGWUTenant + links: + - name: VENBServiceInstance + - name: VENBServiceInstance + - name: VSPGWCTenant + links: + - name: VENBServiceInstance + - name: VSPGWUTenant +proxy_ssh: + enabled: {{ .Values.global.proxySshEnabled }} + user: {{ .Values.global.proxySshUser }} +{{- end -}} diff --git a/helm-charts/xos-services/vspgwu/templates/_tosca.tpl b/helm-charts/xos-services/vspgwu/templates/_tosca.tpl new file mode 100644 index 0000000..fea233a --- /dev/null +++ b/helm-charts/xos-services/vspgwu/templates/_tosca.tpl @@ -0,0 +1,62 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{- define "vspgwu.serviceTosca" -}} +tosca_definitions_version: tosca_simple_yaml_1_0 + +imports: + - custom_types/vspgwuservice.yaml + - custom_types/vspgwuvendor.yaml + - custom_types/flavor.yaml + - custom_types/image.yaml + +description: Configures the vSPGWU service + +topology_template: + node_templates: + + service#vspgwu: + type: tosca.nodes.VSPGWUService + properties: + name: vspgwu + public_key: {{ .publicKey | quote }} + private_key_fn: /opt/xos/services/vspgwu/keys/id_rsa + + intel_vspgwu: + type: tosca.nodes.VSPGWUVendor + properties: + name: intel_vspgwu_{{ .vnfImageVersion }} + requirements: + - image: + node: image_spgwu + relationship: tosca.relationships.BelongsToOne + - flavor: + node: {{ .vnfImageFlavor }} + relationship: tosca.relationships.BelongsToOne + + image_spgwu: + type: tosca.nodes.Image + properties: + name: image_spgwu_{{ .vnfImageVersion }} + disk_format: QCOW2 + container_format: BARE + path: {{ .vnfImageURL }} + + {{ .vnfImageFlavor }}: + type: tosca.nodes.Flavor + properties: + name: {{ .vnfImageFlavor }} +{{- end -}} diff --git a/helm-charts/xos-services/vspgwu/templates/configmap.yaml b/helm-charts/xos-services/vspgwu/templates/configmap.yaml new file mode 100644 index 0000000..12f1ce2 --- /dev/null +++ b/helm-charts/xos-services/vspgwu/templates/configmap.yaml @@ -0,0 +1,23 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: vspgwu +data: + serviceConfig: | +{{ include "vspgwu.serviceConfig" . | indent 4 }} diff --git a/helm-charts/xos-services/vspgwu/templates/deployment.yaml b/helm-charts/xos-services/vspgwu/templates/deployment.yaml new file mode 100644 index 0000000..a6d3bdc --- /dev/null +++ b/helm-charts/xos-services/vspgwu/templates/deployment.yaml @@ -0,0 +1,90 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: apps/v1beta2 +kind: Deployment +metadata: + name: {{ template "vspgwu.fullname" . }} + labels: + app: {{ template "vspgwu.name" . }} + chart: {{ template "vspgwu.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + app: {{ template "vspgwu.name" . }} + release: {{ .Release.Name }} + template: + metadata: + labels: + app: {{ template "vspgwu.name" . }} + release: {{ .Release.Name }} + annotations: + checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} + spec: + containers: + - name: {{ .Chart.Name }} + image: {{ .Values.global.registry }}{{ .Values.image.repository }}:{{ tpl .Values.image.tag . }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + resources: +{{ toYaml .Values.resources | indent 12 }} + volumeMounts: + - name: vspgwu-config + mountPath: /opt/xos/synchronizers/vspgwu/mounted_config.yaml + subPath: mounted_config.yaml + - name: certchain-volume + mountPath: /usr/local/share/ca-certificates/local_certs.crt + subPath: config/ca_cert_chain.pem + - name: vspgwu-keys + mountPath: /opt/xos/services/vspgwu/keys + readOnly: true + - name: node-key + mountPath: /opt/cord_profile + readOnly: true + volumes: + - name: vspgwu-config + configMap: + name: vspgwu + items: + - key: serviceConfig + path: mounted_config.yaml + - name: certchain-volume + configMap: + name: ca-certificates + items: + - key: chain + path: config/ca_cert_chain.pem + - name: vspgwu-keys + secret: + secretName: vspgwu-keys + - name: node-key + secret: + secretName: node-key + defaultMode: 256 + optional: true + {{- with .Values.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} diff --git a/helm-charts/xos-services/vspgwu/templates/secret.yaml b/helm-charts/xos-services/vspgwu/templates/secret.yaml new file mode 100644 index 0000000..961f28f --- /dev/null +++ b/helm-charts/xos-services/vspgwu/templates/secret.yaml @@ -0,0 +1,23 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: Secret +metadata: + name: vspgwu-keys + namespace: default +type: Opaque +data: + id_rsa: {{ .Files.Get .Values.privateKeyFile | b64enc }} \ No newline at end of file diff --git a/helm-charts/xos-services/vspgwu/values.yaml b/helm-charts/xos-services/vspgwu/values.yaml new file mode 100644 index 0000000..9a41837 --- /dev/null +++ b/helm-charts/xos-services/vspgwu/values.yaml @@ -0,0 +1,52 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Default values for vspgwu. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +nameOverride: "" +fullnameOverride: "" + +image: + repository: 'xosproject/vspgwu-synchronizer' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + +xosAdminUser: "admin@opencord.org" +xosAdminPassword: "letmein" + +vnfImageURL: "https://github.com/opencord/vspgwu/releases/download/vms/image-spgwu.qcow2.v0.1.1" +vnfImageVersion: "v0.1.1" +vnfImageFlavor: "m1.xlarge" + +publicKey: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDL5L5vDsQ1bmSeisxMf/GZEqv85oHHu6RFE17VYoTAuBBsHQnETOccbQT85qSBy5NAMAICtOd15iXYfmul0eFeSHoQr1H3IAXT0if6ANxXOm8/Z2rlRNthOEgsjDQU9foNxQ4wksygy5epKmbEhMqbFZjuj4zYfStPzE/gkFSE9QjhKMWaJmyLFfq9f8DnC+TTE41K5iGbtramr7qHSWsKKy75XV6MZZLLFExrQqlYDlLA2V0aYezCql3fB96KJmf6GJRT3j3Y7oWaj7gEzMCycA2QgP8ZNFL/2Q1qgvQRc6I46/HUiOh3IT8LVDdo2ZUn9qrNameQ1zR7a+wBvYIV Insecure M-CORD keypair" +privateKeyFile: "files/id_rsa" + +# These variables can be overridden by the profile chart +global: + proxySshEnabled: true + proxySshUser: "root" + registry: '' + +resources: {} + +nodeSelector: {} + +tolerations: [] + +affinity: {} diff --git a/helm-charts/xos-services/vtn-service/.helmignore b/helm-charts/xos-services/vtn-service/.helmignore new file mode 100644 index 0000000..f0c1319 --- /dev/null +++ b/helm-charts/xos-services/vtn-service/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj diff --git a/helm-charts/xos-services/vtn-service/Chart.yaml b/helm-charts/xos-services/vtn-service/Chart.yaml new file mode 100644 index 0000000..caf2ae5 --- /dev/null +++ b/helm-charts/xos-services/vtn-service/Chart.yaml @@ -0,0 +1,22 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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: vtn-service +description: A Helm chart for XOS's "vtn-service" service +icon: https://guide.opencord.org/logos/cord.svg + +version: 1.0.4 +appVersion: 1.0.4 + diff --git a/helm-charts/xos-services/vtn-service/templates/_helpers.tpl b/helm-charts/xos-services/vtn-service/templates/_helpers.tpl new file mode 100644 index 0000000..40250c2 --- /dev/null +++ b/helm-charts/xos-services/vtn-service/templates/_helpers.tpl @@ -0,0 +1,77 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{/* +Expand the name of the chart. +*/}} +{{- define "vtn.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "vtn.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "vtn.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- define "vtn.serviceConfig" -}} +name: vtn +accessor: + username: {{ .Values.xosAdminUser | quote }} + password: {{ .Values.xosAdminPassword | quote }} + endpoint: xos-core:50051 +logging: + version: 1 + handlers: + console: + class: logging.StreamHandler + file: + class: logging.handlers.RotatingFileHandler + filename: /var/log/xos.log + maxBytes: 10485760 + backupCount: 5 + kafka: + class: kafkaloghandler.KafkaLogHandler + bootstrap_servers: + - "cord-kafka:9092" + topic: xos.log.vtn-service + loggers: + '': + handlers: + - console + - file + - kafka + level: DEBUG +{{- end -}} diff --git a/helm-charts/xos-services/vtn-service/templates/_tosca.tpl b/helm-charts/xos-services/vtn-service/templates/_tosca.tpl new file mode 100644 index 0000000..8777b24 --- /dev/null +++ b/helm-charts/xos-services/vtn-service/templates/_tosca.tpl @@ -0,0 +1,67 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{- define "vtn-service.serviceTosca" -}} +tosca_definitions_version: tosca_simple_yaml_1_0 + +imports: + - custom_types/servicedependency.yaml + - custom_types/serviceinstance.yaml + - custom_types/serviceinstanceattribute.yaml + - custom_types/vtnservice.yaml + +description: Configures the VTN ONOS service + +topology_template: + node_templates: + + service#vtn: + type: tosca.nodes.VTNService + properties: + name: vtn + kind: control + privateGatewayMac: 00:00:00:00:00:01 + localManagementIp: 172.27.0.1/24 + ovsdbPort: 6641 + sshUser: {{ .sshUser }} + sshKeyFile: /root/vtn/node_key + sshPort: {{ .sshPort }} + xosEndpoint: xos-chameleon:9101 + xosUser: {{ .xosAdminUser }} + xosPassword: {{ .xosAdminPassword }} + vtnAPIVersion: 2 + controllerPort: onos-cord-openflow:6653 + resync: false + + vtn_service_instance: + type: tosca.nodes.ServiceInstance + properties: + name: VTN config + requirements: + - owner: + node: service#vtn + relationship: tosca.relationships.BelongsToOne + + vtn_config: + type: tosca.nodes.ServiceInstanceAttribute + properties: + name: autogenerate + value: vtn-network-cfg + requirements: + - service_instance: + node: vtn_service_instance + relationship: tosca.relationships.BelongsToOne +{{- end -}} diff --git a/helm-charts/xos-services/vtn-service/templates/configmap.yaml b/helm-charts/xos-services/vtn-service/templates/configmap.yaml new file mode 100644 index 0000000..4349407 --- /dev/null +++ b/helm-charts/xos-services/vtn-service/templates/configmap.yaml @@ -0,0 +1,23 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: vtn +data: + serviceConfig: | +{{ include "vtn.serviceConfig" . | indent 4 }} diff --git a/helm-charts/xos-services/vtn-service/templates/deployment.yaml b/helm-charts/xos-services/vtn-service/templates/deployment.yaml new file mode 100644 index 0000000..ccecd3a --- /dev/null +++ b/helm-charts/xos-services/vtn-service/templates/deployment.yaml @@ -0,0 +1,76 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: apps/v1beta2 +kind: Deployment +metadata: + name: {{ template "vtn.fullname" . }} + labels: + app: {{ template "vtn.name" . }} + chart: {{ template "vtn.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + app: {{ template "vtn.name" . }} + release: {{ .Release.Name }} + template: + metadata: + labels: + app: {{ template "vtn.name" . }} + release: {{ .Release.Name }} + annotations: + checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} + spec: + containers: + - name: {{ .Chart.Name }} + image: {{ .Values.global.registry }}{{ .Values.image.repository }}:{{ tpl .Values.image.tag . }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + resources: +{{ toYaml .Values.resources | indent 12 }} + volumeMounts: + - name: vtn-config + mountPath: /opt/xos/synchronizers/vtn/mounted_config.yaml + subPath: mounted_config.yaml + - name: certchain-volume + mountPath: /usr/local/share/ca-certificates/local_certs.crt + subPath: config/ca_cert_chain.pem + volumes: + - name: vtn-config + configMap: + name: vtn + items: + - key: serviceConfig + path: mounted_config.yaml + - name: certchain-volume + configMap: + name: ca-certificates + items: + - key: chain + path: config/ca_cert_chain.pem + {{- with .Values.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} diff --git a/helm-charts/xos-services/vtn-service/values.yaml b/helm-charts/xos-services/vtn-service/values.yaml new file mode 100644 index 0000000..f15fd29 --- /dev/null +++ b/helm-charts/xos-services/vtn-service/values.yaml @@ -0,0 +1,45 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Default values for VTN +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +nameOverride: "" +fullnameOverride: "" + +image: + repository: 'xosproject/vtn-synchronizer' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + +global: + registry: '' + +xosAdminUser: "admin@opencord.org" +xosAdminPassword: "letmein" + +sshUser: "root" +sshPort: 22 + +resources: {} + +nodeSelector: {} + +tolerations: [] + +affinity: {} diff --git a/helm-charts/xos-tools/kafkacat/Chart.yaml b/helm-charts/xos-tools/kafkacat/Chart.yaml new file mode 100644 index 0000000..39e9fb5 --- /dev/null +++ b/helm-charts/xos-tools/kafkacat/Chart.yaml @@ -0,0 +1,23 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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: kafkacat +description: A Helm chart for kafkacat +icon: https://kafka.apache.org/images/logo.png + +version: 1.0.0 + +# version of confluentinc/cp-kafkacat container +appVersion: 4.1.2 diff --git a/helm-charts/xos-tools/kafkacat/templates/NOTES.txt b/helm-charts/xos-tools/kafkacat/templates/NOTES.txt new file mode 100644 index 0000000..5b580a1 --- /dev/null +++ b/helm-charts/xos-tools/kafkacat/templates/NOTES.txt @@ -0,0 +1,11 @@ +Thank you for installing {{ .Chart.Name }}. + +Your release is named {{ .Release.Name }}. + +You can use this container to listen to event on Kafka. +To do that, exec in the pod and run: + +kafkacat -C -b -t + + + diff --git a/helm-charts/xos-tools/kafkacat/templates/deployment.yaml b/helm-charts/xos-tools/kafkacat/templates/deployment.yaml new file mode 100644 index 0000000..de219c9 --- /dev/null +++ b/helm-charts/xos-tools/kafkacat/templates/deployment.yaml @@ -0,0 +1,41 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: apps/v1beta2 +kind: Deployment +metadata: + name: kafkacat + labels: + app: kafkacat + chart: kafkacat + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + replicas: 1 + selector: + matchLabels: + app: kafkacat + release: {{ .Release.Name }} + template: + metadata: + labels: + app: kafkacat + release: {{ .Release.Name }} + spec: + containers: + - name: kafkacat + image: {{ .Values.global.registry }}{{ .Values.image.repository }}:{{ tpl .Values.image.tag . }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + command: ["/bin/bash", "-c", "sleep 86400"] diff --git a/helm-charts/xos-tools/kafkacat/values.yaml b/helm-charts/xos-tools/kafkacat/values.yaml new file mode 100644 index 0000000..6b96e1b --- /dev/null +++ b/helm-charts/xos-tools/kafkacat/values.yaml @@ -0,0 +1,34 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Default values for xossh +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +nameOverride: "" +fullnameOverride: "" + +imagePullPolicy: Always + +image: + repository: 'confluentinc/cp-kafkacat' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + +global: + registry: '' + diff --git a/helm-charts/xos-tools/xos-tester/Chart.yaml b/helm-charts/xos-tools/xos-tester/Chart.yaml new file mode 100644 index 0000000..fda91d7 --- /dev/null +++ b/helm-charts/xos-tools/xos-tester/Chart.yaml @@ -0,0 +1,23 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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: xos-tester +description: A Helm chart to run tests against an XOS deployment +icon: https://guide.opencord.org/logos/xos.svg + +version: 1.0.0 + +# version of xosproject/xos-api-tester container +appVersion: latest diff --git a/helm-charts/xos-tools/xos-tester/templates/NOTES.txt b/helm-charts/xos-tools/xos-tester/templates/NOTES.txt new file mode 100644 index 0000000..1d8c850 --- /dev/null +++ b/helm-charts/xos-tools/xos-tester/templates/NOTES.txt @@ -0,0 +1,7 @@ +Thank you for installing {{ .Chart.Name }}. + +Your release is named {{ .Release.Name }}. + +This helm chart will perform test against a running installation of XOS. + +To view the result of the tests check the logs of the container diff --git a/helm-charts/xos-tools/xos-tester/templates/_helpers.tpl b/helm-charts/xos-tools/xos-tester/templates/_helpers.tpl new file mode 100644 index 0000000..29a7e0b --- /dev/null +++ b/helm-charts/xos-tools/xos-tester/templates/_helpers.tpl @@ -0,0 +1,18 @@ +# Copyright 2018-present Open Networking Foundation +# +# 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. + +{{- define "xos-tester.config" }} +#!/usr/bin/env bash +{{ .Values.testCommand }} +{{- end }} diff --git a/helm-charts/xos-tools/xos-tester/templates/configmap.yaml b/helm-charts/xos-tools/xos-tester/templates/configmap.yaml new file mode 100644 index 0000000..5666a0b --- /dev/null +++ b/helm-charts/xos-tools/xos-tester/templates/configmap.yaml @@ -0,0 +1,26 @@ +--- +# Copyright 2017-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: xos-tester-command + labels: + app: xos-tester + chart: xos-tester + release: {{ .Release.Name }} +data: + command: | +{{ include "xos-tester.config" . | indent 4 }} diff --git a/helm-charts/xos-tools/xos-tester/templates/job.yaml b/helm-charts/xos-tools/xos-tester/templates/job.yaml new file mode 100644 index 0000000..eaa6d86 --- /dev/null +++ b/helm-charts/xos-tools/xos-tester/templates/job.yaml @@ -0,0 +1,51 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: batch/v1 +kind: Job +metadata: + name: xos-tester + labels: + app: xos-tester + chart: xos-tester + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + template: + metadata: + labels: + app: xos-tester + release: {{ .Release.Name }} + spec: + restartPolicy: Never + containers: + - name: xos-tester + image: {{ .Values.global.registry }}{{ .Values.image.repository }}:{{ tpl .Values.image.tag . }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + command: [ + "bash", + "run_tests.sh" + ] + volumeMounts: + - name: xos-tester-command + mountPath: /src/cord-api/Tests/run_tests.sh + subPath: command/run_tests.sh + volumes: + - name: xos-tester-command + configMap: + name: xos-tester-command + items: + - key: command + path: command/run_tests.sh diff --git a/helm-charts/xos-tools/xos-tester/values.yaml b/helm-charts/xos-tools/xos-tester/values.yaml new file mode 100644 index 0000000..467ab63 --- /dev/null +++ b/helm-charts/xos-tools/xos-tester/values.yaml @@ -0,0 +1,35 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Default values for xossh +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +nameOverride: "" +fullnameOverride: "" + +imagePullPolicy: Always + +testCommand: "robot --variable timeout:300s --variable num_olts:1 --variable num_onus:1 --variable num_pon_ports:1 --variable cord_kafka:cord-kafka XosScaleValidations/xos-scale-att-workflow.robot" + +image: + repository: 'xosproject/xos-api-tester' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + +global: + registry: '' diff --git a/helm-charts/xos-tools/xossh/Chart.yaml b/helm-charts/xos-tools/xossh/Chart.yaml new file mode 100644 index 0000000..e9b9631 --- /dev/null +++ b/helm-charts/xos-tools/xossh/Chart.yaml @@ -0,0 +1,22 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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: xossh +description: A Helm chart for xossh, the XOS command line shell +icon: https://guide.opencord.org/logos/xos.svg +version: 3.0.0 + +# Runs the xosproject/xos-client container +appVersion: 3.2.3 diff --git a/helm-charts/xos-tools/xossh/README.md b/helm-charts/xos-tools/xossh/README.md new file mode 100644 index 0000000..9d08a67 --- /dev/null +++ b/helm-charts/xos-tools/xossh/README.md @@ -0,0 +1,15 @@ +To use xossh, execute the following from your `helm-charts` directory: + +``` +# start the xossh container +helm install xos-tools/xossh -n xossh + +# wait a few seconds for the container to start, then run the following +xos-tools/xossh/xossh-attach.sh +``` + +To deploy a development version of `xossh` tagged with the `candidate` tag, you can do: + +``` +helm install xos-tools/xossh/ -n xossh -f examples/xossh-candidate.yaml +``` diff --git a/helm-charts/xos-tools/xossh/templates/_helpers.tpl b/helm-charts/xos-tools/xossh/templates/_helpers.tpl new file mode 100644 index 0000000..524d996 --- /dev/null +++ b/helm-charts/xos-tools/xossh/templates/_helpers.tpl @@ -0,0 +1,47 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Copyright 2018-present Open Networking Foundation + +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. +*/}} +{{/* +Expand the name of the chart. +*/}} +{{- define "xossh.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "xossh.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "xossh.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} diff --git a/helm-charts/xos-tools/xossh/templates/configmap.yaml b/helm-charts/xos-tools/xossh/templates/configmap.yaml new file mode 100644 index 0000000..2d98f49 --- /dev/null +++ b/helm-charts/xos-tools/xossh/templates/configmap.yaml @@ -0,0 +1,23 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: xossh +data: + xosshConfig: | +{{ toYaml .Values.xosshConfig | indent 4 }} diff --git a/helm-charts/xos-tools/xossh/templates/deployment.yaml b/helm-charts/xos-tools/xossh/templates/deployment.yaml new file mode 100644 index 0000000..e39375d --- /dev/null +++ b/helm-charts/xos-tools/xossh/templates/deployment.yaml @@ -0,0 +1,85 @@ +--- + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +apiVersion: apps/v1beta2 +kind: Deployment +metadata: + name: {{ template "xossh.fullname" . }} + labels: + app: {{ template "xossh.name" . }} + chart: {{ template "xossh.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + app: {{ template "xossh.name" . }} + release: {{ .Release.Name }} + template: + metadata: + labels: + app: {{ template "xossh.name" . }} + release: {{ .Release.Name }} + spec: + containers: + - name: {{ .Chart.Name }} + args: + - "/usr/bin/xossh" + - "-u" + - "{{ .Values.xosshConfig.accessor.username }}" + - "-p" + - "{{ .Values.xosshConfig.accessor.password }}" + - "-S" + - "{{ .Values.xosshConfig.accessor.endpoint }}" + stdin: true + tty: true + image: {{ .Values.global.registry }}{{ .Values.image.repository }}:{{ tpl .Values.image.tag . }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + resources: +{{ toYaml .Values.resources | indent 12 }} + volumeMounts: + - name: certchain-volume + mountPath: /usr/local/share/ca-certificates/local_certs.crt + subPath: config/ca_cert_chain.pem + - name: xossh-config + mountPath: /opt/xos/config.yml + subPath: config.yml + volumes: + - name: certchain-volume + configMap: + name: ca-certificates + items: + - key: chain + path: config/ca_cert_chain.pem + - name: xossh-config + configMap: + name: xossh + items: + - key: xosshConfig + path: config.yml + {{- with .Values.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} diff --git a/helm-charts/xos-tools/xossh/values.yaml b/helm-charts/xos-tools/xossh/values.yaml new file mode 100644 index 0000000..aeccd83 --- /dev/null +++ b/helm-charts/xos-tools/xossh/values.yaml @@ -0,0 +1,62 @@ +--- +# Copyright 2018-present Open Networking Foundation +# +# 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. + +# Default values for xossh +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +nameOverride: "" +fullnameOverride: "" + +image: + repository: 'xosproject/xos-client' + tag: '{{ .Chart.AppVersion }}' + pullPolicy: 'Always' + +global: + registry: '' + +resources: {} + +nodeSelector: {} + +tolerations: [] + +affinity: {} + +xosshConfig: + name: xossh + accessor: + username: admin@opencord.org + password: letmein + endpoint: xos-core:50051 + logging: + version: 1 + handlers: + console: + class: logging.StreamHandler + file: + class: logging.handlers.RotatingFileHandler + filename: /var/log/xos.log + maxBytes: 10485760 + backupCount: 5 + loggers: + '': + handlers: + - console + - file + level: DEBUG diff --git a/helm-charts/xos-tools/xossh/xossh-attach.sh b/helm-charts/xos-tools/xossh/xossh-attach.sh new file mode 100755 index 0000000..aeb93f0 --- /dev/null +++ b/helm-charts/xos-tools/xossh/xossh-attach.sh @@ -0,0 +1,18 @@ +#! /bin/bash + +# Copyright 2018-present Open Networking Foundation +# +# 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. + +XOSSH_POD=`kubectl get pods | grep -i xossh | cut -f 1 -d " "` +kubectl attach $XOSSH_POD -i -c xossh -- 2.16.6