Add Node Interface metrics exporter app to StarlingX

This commit contains integration of node interface metrics microservice
,python plugin and custom helm chart for metrics exporter app. As per
requirement node interface metrics pod run on worker node.

This builds a deb format package that contains the .tgz file that can be
installed on the controller using the system application tool.

Test plan:
PASSED: Build process is successful with creation of debian package.
PASSED: Extract the content of the debian package and check if the helm
chart tar file is present.
PASSED: AIO-SX app successfully uploaded, applied, removed and deleted
        using the 'system application' commands.
PASSED: AIO-DX app successfully uploaded, applied, removed and deleted
        using the 'system application' commands.
PASSED: STANDARD app successfully uploaded, applied, removed and deleted
        using the 'system application' commands. Verified pods are
        running on compute node only.
PASSED: After delete All  the helm chart has been removed as well all
        K8s resources.
PASSED: Update application version from 1.0-1 to 1.0-2

Story: 2010918
Task: 48885
Change-Id: I93d7494b04be16c808a6ad6af115659f8298ee10
Signed-off-by: Mayank Patel <mayank.patel@windriver.com>
This commit is contained in:
Mayank Patel 2023-10-04 07:55:40 -04:00
parent b718b0e230
commit 6d3ebf4dc6
26 changed files with 644 additions and 109 deletions

View File

@ -3,6 +3,47 @@
check:
jobs:
- openstack-tox-linters
- k8sapp-node-interface-metrics-exporter-tox-py39
- k8sapp-node-interface-metrics-exporter-tox-pylint
gate:
jobs:
- openstack-tox-linters
- k8sapp-node-interface-metrics-exporter-tox-py39
- k8sapp-node-interface-metrics-exporter-tox-pylint
- job:
name: k8sapp-node-interface-metrics-exporter-tox-py39
parent: openstack-tox-py39
description: |
Run py39 test for k8sapp_node_interface_metrics_exporter
nodeset: debian-bullseye
required-projects:
- starlingx/config
- starlingx/fault
- starlingx/update
- starlingx/utilities
- starlingx/root
files:
- python3-k8sapp-node-interface-metrics-exporter/*
vars:
tox_extra_args: -c python3-k8sapp-node-interface-metrics-exporter/k8sapp_node_interface_metrics_exporter/tox.ini
tox_constraints_file: '{{ ansible_user_dir }}/src/opendev.org/starlingx/root/build-tools/requirements/debian/upper-constraints.txt'
- job:
name: k8sapp-node-interface-metrics-exporter-tox-pylint
parent: tox
description: |
Run pylint test for k8sapp_node_interface_metrics_exporter
nodeset: debian-bullseye
required-projects:
- starlingx/config
- starlingx/fault
- starlingx/update
- starlingx/utilities
- starlingx/root
files:
- python3-k8sapp-node-interface-metrics-exporter/*
vars:
tox_envlist: pylint
tox_extra_args: -c python3-k8sapp-node-interface-metrics-exporter/k8sapp_node_interface_metrics_exporter/tox.ini
tox_constraints_file: '{{ ansible_user_dir }}/src/opendev.org/starlingx/root/build-tools/requirements/debian/upper-constraints.txt'

10
bindep.txt Normal file
View File

@ -0,0 +1,10 @@
# This is a cross-platform list tracking distribution packages needed for install and tests;
# see https://docs.openstack.org/infra/bindep/ for additional information.
libffi-dev [platform:dpkg]
libldap2-dev [platform:dpkg]
libxml2-dev [platform:dpkg]
libxslt1-dev [platform:dpkg]
libsasl2-dev [platform:dpkg]
libffi-devel [platform:rpm]
python3-all-dev [platform:dpkg]

View File

@ -0,0 +1,35 @@
# Compiled files
*.py[co]
*.a
*.o
*.so
# Sphinx
_build
doc/source/api/
# Packages/installer info
*.egg
*.egg-info
dist
build
eggs
parts
var
sdist
develop-eggs
.installed.cfg
# Other
*.DS_Store
.stestr
.testrepository
.tox
.venv
.*.swp
.coverage
bandit.xml
cover
AUTHORS
ChangeLog
*.sqlite

View File

@ -3,5 +3,5 @@ k8sapp-node-interface-merics-exporter
This project contains StarlingX Kubernetes application specific python plugins
for Node Interface Metrics Exporter. These plugins are required to integrate
the Power Metrics application into the StarlingX application framework and to
support the various StarlingX deployments.
the Node Metrics Exporter application into the StarlingX application framework
and to support the various StarlingX deployments.

View File

@ -5,10 +5,13 @@
#
# Namespace to deploy the application
HELM_NS_PM = 'node-interface-metrics-exporter'
HELM_NS_METRICS_EXPORTER = 'node-interface-metrics-exporter'
# Application Name
HELM_APP_PM = 'node-interface-metrics-exporter'
HELM_APP_METRICS_EXPORTER = 'node-interface-metrics-exporter'
# Chart Name
HELM_CHART_METRICS_EXPORTER = 'node-interface-metrics-exporter'
# Application component label
HELM_LABEL_PARAMETER = 'podLabels'

View File

@ -4,68 +4,42 @@
# SPDX-License-Identifier: Apache-2.0
#
from oslo_log import log as logging
from k8sapp_node_interface_metrics_exporter.common import constants as app_constants
from oslo_log import log as logging
from sysinv.common import constants
from sysinv.common import exception
from sysinv.common import kubernetes
from sysinv.db import api as sys_dbapi
from sysinv.helm import base
LOG = logging.getLogger(__name__)
class NodeInterfaceMetricsExporterHelm(base.FluxCDBaseHelm):
class NodeInterfaceMetricsExporterHelm(base.BaseHelm):
"""Class to encapsulate helm operations for the metrics exporter chart."""
SUPPORTED_NAMESPACES = base.FluxCDBaseHelm.SUPPORTED_NAMESPACES + \
[app_constants.HELM_NS_PM]
SUPPORTED_NAMESPACES = base.BaseHelm.SUPPORTED_NAMESPACES + \
[app_constants.HELM_NS_METRICS_EXPORTER]
SUPPORTED_APP_NAMESPACES = {
app_constants.HELM_APP_PM: SUPPORTED_NAMESPACES
app_constants.HELM_APP_METRICS_EXPORTER: SUPPORTED_NAMESPACES
}
SERVICE_NAME = app_constants.HELM_APP_PM
SERVICE_NAME = app_constants.HELM_APP_METRICS_EXPORTER
SUPPORTED_COMPONENT_OVERRIDES = [
app_constants.HELM_COMPONENT_LABEL_VALUE_PLATFORM,
app_constants.HELM_COMPONENT_LABEL_VALUE_APPLICATION
]
DEFAULT_AFFINITY = app_constants.HELM_COMPONENT_LABEL_VALUE_PLATFORM
CHART = app_constants.HELM_CHART_METRICS_EXPORTER
def get_namespaces(self):
return self.SUPPORTED_NAMESPACES
def get_overrides(self, namespace=None):
dbapi_instance = dbapi.get_instance()
db_app = dbapi_instance.kube_app_get(app_constants.HELM_APP_PM)
# User chart overrides
chart_overrides = self._get_user_helm_overrides(
dbapi_instance,
db_app,
app_constants.HELM_NS_PM,
'user_overrides')
user_affinity = chart_overrides.get(app_constants.HELM_COMPONENT_LABEL,
self.DEFAULT_AFFINITY)
if user_affinity in self.SUPPORTED_COMPONENT_OVERRIDES:
affinity = user_affinity
else:
LOG.warn(f"User override value {user_affinity} "
f"for {app_constants.HELM_COMPONENT_LABEL} is invalid, "
f"using default value {self.DEFAULT_AFFINITY}")
affinity = self.DEFAULT_AFFINITY
overrides = {
app_constants.HELM_NS_PM: {
app_constants.HELM_LABEL_PARAMETER: {
app_constants.HELM_COMPONENT_LABEL: affinity
}
}
app_constants.HELM_NS_METRICS_EXPORTER: {}
}
if namespace in self.SUPPORTED_NAMESPACES:
@ -75,22 +49,3 @@ class NodeInterfaceMetricsExporterHelm(base.FluxCDBaseHelm):
raise exception.InvalidHelmNamespace(chart=self.CHART,
namespace=namespace)
return overrides
@staticmethod
def _get_user_helm_overrides(dbapi_instance, app, chart, namespace,
type_of_overrides):
"""Helper function for querying helm overrides from db."""
helm_overrides = {}
try:
overrides = dbapi_instance.helm_override_get(
app_id=app.id,
name=chart,
namespace=namespace,
)[type_of_overrides]
if isinstance(overrides, str):
helm_overrides = yaml.safe_load(overrides)
except exception.HelmOverrideNotFound:
LOG.debug("Overrides for this chart not found, nothing to be done.")
return helm_overrides

View File

@ -10,12 +10,165 @@
from oslo_log import log as logging
from sysinv.common import constants as sysinv_constants
import yaml
from sysinv.common import constants as inv_constants
from sysinv.common import exception
from sysinv.common import kubernetes
from sysinv.common import utils as cutils
from sysinv.helm import lifecycle_base as base
from sysinv.helm import lifecycle_utils
from sysinv.helm.lifecycle_constants import LifecycleConstants
from k8sapp_node_interface_metrics_exporter.common import constants as app_constants
LOG = logging.getLogger(__name__)
class NodeInterfaceMetricsExporterAppLifecycleOperator(base.AppLifecycleOperator):
def app_lifecycle_actions(
self, context, conductor_obj, app_op, app, hook_info
):
"""Perform lifecycle actions for an operation
:param context: request context, can be None
:param conductor_obj: conductor object, can be None
:param app_op: AppOperator object
:param app: AppOperator.Application object
:param hook_info: LifecycleHookInfo object
"""
if hook_info.lifecycle_type == inv_constants.APP_LIFECYCLE_TYPE_FLUXCD_REQUEST:
if hook_info.operation == inv_constants.APP_APPLY_OP:
if hook_info.relative_timing == inv_constants.APP_LIFECYCLE_TIMING_POST:
return self.post_apply(app_op, app, hook_info)
if hook_info.lifecycle_type == inv_constants.APP_LIFECYCLE_TYPE_OPERATION:
if hook_info.operation == inv_constants.APP_REMOVE_OP:
if hook_info.relative_timing == inv_constants.APP_LIFECYCLE_TIMING_POST:
return self.post_remove(app)
super(
NodeInterfaceMetricsExporterAppLifecycleOperator, self
).app_lifecycle_actions(context, conductor_obj, app_op, app, hook_info)
def post_apply(self, app_op, app, hook_info):
if LifecycleConstants.EXTRA not in hook_info:
raise exception.LifecycleMissingInfo("Missing {}".format(LifecycleConstants.EXTRA))
if LifecycleConstants.RETURN_CODE not in hook_info[LifecycleConstants.EXTRA]:
raise exception.LifecycleMissingInfo(
"Missing {} {}".format(LifecycleConstants.EXTRA, LifecycleConstants.RETURN_CODE))
# raise a specific exception to be caught by the
# retry decorator and attempt a re-apply
if not hook_info[LifecycleConstants.EXTRA][LifecycleConstants.RETURN_CODE] and \
not app_op.is_app_aborted(app.name):
LOG.info("%s app failed applying. Retrying." % str(app.name))
raise exception.ApplicationApplyFailure(name=app.name)
dbapi_instance = app_op._dbapi
db_app_id = dbapi_instance.kube_app_get(app.name).id
client_core = app_op._kube._get_kubernetesclient_core()
component_constant = (
app_constants.HELM_COMPONENT_LABEL
)
# chart overrides
chart_overrides = self._get_helm_user_overrides(
dbapi_instance, db_app_id
)
override_label = {}
# Namespaces variables
namespace = client_core.read_namespace(
app_constants.HELM_NS_METRICS_EXPORTER
)
# Old namespace variable
old_namespace_label = (
namespace.metadata.labels.get(component_constant)
if component_constant in namespace.metadata.labels
else None
)
if component_constant in chart_overrides:
# User Override variables
dict_chart_overrides = yaml.safe_load(chart_overrides)
override_label = dict_chart_overrides.get(component_constant)
if override_label == "application":
namespace.metadata.labels.update(
{component_constant: "application"}
)
app_op._kube.kube_patch_namespace(
app_constants.HELM_NS_METRICS_EXPORTER, namespace
)
elif override_label == "platform":
namespace.metadata.labels.update({component_constant: "platform"})
app_op._kube.kube_patch_namespace(
app_constants.HELM_NS_METRICS_EXPORTER, namespace
)
elif not override_label:
namespace.metadata.labels.update({component_constant: "platform"})
app_op._kube.kube_patch_namespace(
app_constants.HELM_NS_METRICS_EXPORTER, namespace
)
else:
LOG.info(
f"WARNING: Namespace label {override_label} not supported"
)
namespace_label = namespace.metadata.labels.get(component_constant)
if old_namespace_label != namespace_label:
self._delete_ineterface_metrics_exporter_pods(app_op, client_core)
def post_remove(self, app):
LOG.debug(
"Executing post_remove for {} app".format(
app_constants.HELM_APP_METRICS_EXPORTER
)
)
cmd = [
"kubectl",
"--kubeconfig",
kubernetes.KUBERNETES_ADMIN_CONF,
"delete",
"namespace",
app_constants.HELM_NS_METRICS_EXPORTER,
]
stdout, stderr = cutils.trycmd(*cmd)
LOG.debug(
"{} app: cmd={} stdout={} stderr={}".format(
app.name, cmd, stdout, stderr
)
)
def _get_helm_user_overrides(self, dbapi_instance, db_app_id):
try:
overrides = dbapi_instance.helm_override_get(
app_id=db_app_id,
name=app_constants.HELM_APP_METRICS_EXPORTER,
namespace=app_constants.HELM_NS_METRICS_EXPORTER,
)
except exception.HelmOverrideNotFound:
values = {
"name": app_constants.HELM_APP_METRICS_EXPORTER,
"namespace": app_constants.HELM_NS_METRICS_EXPORTER,
"db_app_id": db_app_id,
}
overrides = dbapi_instance.helm_override_create(values=values)
return overrides.user_overrides or ""
def _delete_ineterface_metrics_exporter_pods(self, app_op, client_core):
# pod list
system_pods = client_core.list_namespaced_pod(
app_constants.HELM_NS_METRICS_EXPORTER
)
# On namespace label change delete pods to force restart
for pod in system_pods.items:
app_op._kube.kube_delete_pod(
name=pod.metadata.name,
namespace=app_constants.HELM_NS_METRICS_EXPORTER,
grace_periods_seconds=0,
)

View File

@ -30,4 +30,4 @@ class NodeInterfaceMetricsExporterTestCaseDummy(
"""Dummy Class to pass the zuul."""
def test_dummy(self):
pass
pass

View File

@ -10,7 +10,7 @@ from k8sapp_node_interface_metrics_exporter.common import constants as app_const
class K8SAppNodeInterfaceMetricsExporterAppMixin(object):
app_name = app_constants.HELM_APP_PM
app_name = app_constants.HELM_APP_METRICS_EXPORTER
path_name = app_name + '.tgz'
# pylint: disable=invalid-name,useless-parent-delegation

View File

@ -14,7 +14,7 @@ persistent=yes
# List of plugins (as comma separated values of python modules names) to load,
# usually to register additional checkers.
load-plugins=pylint.extensions.bad_builtin
load-plugins=
# Use multiple processes to speed up Pylint.
jobs=4
@ -39,16 +39,21 @@ extension-pkg-whitelist=lxml.etree,greenlet
# https://pylint.readthedocs.io/en/latest/user_guide
disable=
# C codes refer to Convention
C0103, # invalid-name
C0114, # missing-module-docstring
C0115, # missing-class-docstring
C0116, # missing-function-docstring
C0209, # consider-using-f-string
C0301, # line-too-long
# R codes refer to refactoring
R0205, # useless-object-inheritance
R0901, # too-many-ancestors
R0903, # too-few-public-methods
R0913, # too-many-arguments
# W codes are warnings
W0212, # protected-access
R1710, # inconsistent-return-statements
R1725, # super-with-arguments
W0212, # protected-access
[REPORTS]
# Set the output format. Available formats are text, parseable, colorized, msvs
@ -229,6 +234,5 @@ valid-classmethod-first-arg=cls
[EXCEPTIONS]
# Exceptions that will emit a warning when being caught. Defaults to
# "Exception"
# Exceptions that will emit a warning when caught.
overgeneral-exceptions=builtins.BaseException,builtins.Exception

View File

@ -30,7 +30,7 @@ systemconfig.helm_applications =
node-interface-metrics-exporter = systemconfig.helm_plugins.node_interface_metrics_exporter
systemconfig.helm_plugins.node_interface_metrics_exporter =
001_metrics-exporter = k8sapp_node_interface_metrics_exporter.helm.node_interface_metrics_exporter:NodeInterfaceMetricsExporterHelm
001_node-interface-metrics-exporter = k8sapp_node_interface_metrics_exporter.helm.node_interface_metrics_exporter:NodeInterfaceMetricsExporterHelm
systemconfig.app_lifecycle =
node-interface-metrics-exporter = k8sapp_node_interface_metrics_exporter.lifecycle.lifecycle_node_interface_metrics_exporter:NodeInterfaceMetricsExporterAppLifecycleOperator

View File

@ -17,4 +17,4 @@ testrepository>=0.0.18
testtools!=1.2.0,>=0.9.36
isort<5;python_version>="3.0"
pylint
pycryptodomex
pycryptodomex

View File

@ -0,0 +1,179 @@
[tox]
envlist = flake8,py39,pylint
minversion = 1.6
skipsdist = True
# tox does not work if the path to the workdir is too long, so move it to /tmp
# tox 3.1.0 adds TOX_LIMITED_SHEBANG
toxworkdir = /tmp/{env:USER}_k8snodeinterfacemetricsexportertox
stxdir = {toxinidir}/../../..
distshare={toxworkdir}/.tox/distshare
[testenv]
basepython = python3.9
usedevelop = True
# tox is silly... these need to be separated by a newline....
allowlist_externals = bash
find
install_command = pip install -v -v -v \
-c{env:UPPER_CONSTRAINTS_FILE:https://opendev.org/starlingx/root/raw/branch/master/build-tools/requirements/debian/upper-constraints.txt} \
{opts} {packages}
# Note the hash seed is set to 0 until can be tested with a
# random hash seed successfully.
setenv = VIRTUAL_ENV={envdir}
PYTHONHASHSEED=0
PIP_RESOLVER_DEBUG=1
PYTHONDONTWRITEBYTECODE=1
OS_TEST_PATH=./k8sapp_node_interface_metrics_exporter/tests
LANG=en_US.UTF-8
LANGUAGE=en_US:en
LC_ALL=C
EVENTS_YAML=./k8sapp_node_interface_metrics_exporter/tests/events_for_testing.yaml
SYSINV_TEST_ENV=True
TOX_WORK_DIR={toxworkdir}
PYLINTHOME={toxworkdir}
deps = -r{toxinidir}/requirements.txt
-r{toxinidir}/test-requirements.txt
-e{[tox]stxdir}/config/sysinv/sysinv/sysinv
-e{[tox]stxdir}/config/tsconfig/tsconfig
-e{[tox]stxdir}/fault/fm-api/source
-e{[tox]stxdir}/fault/python-fmclient/fmclient
-e{[tox]stxdir}/update/sw-patch/cgcs-patch
-e{[tox]stxdir}/utilities/ceph/python-cephclient/python-cephclient
commands =
find . -type f -name "*.pyc" -delete
[flake8]
# H series are hacking
# H101 is TODO
# H102 is apache license
# H104 file contains only comments (ie: license)
# H105 author tags
# H306 imports not in alphabetical order
# H401 docstring should not start with a space
# H403 multi line docstrings should end on a new line
# H404 multi line docstring should start without a leading new line
# H405 multi line docstring summary not separated with an empty line
# H701 Empty localization string
# H702 Formatting operation should be outside of localization method call
# H703 Multiple positional placeholders
# B series are bugbear
# B006 Do not use mutable data structures for argument defaults. Needs to be FIXED.
# B007 Loop control variable not used within the loop body.
# B009 Do not call getattr with a constant attribute value
# B010 Do not call setattr with a constant attribute value
# B012 return/continue/break inside finally blocks cause exceptions to be silenced
# B014 Redundant exception types
# B301 Python 3 does not include `.iter*` methods on dictionaries. (this should be suppressed on a per line basis)
# W series are warnings
# W503 line break before binary operator
# W504 line break after binary operator
# W605 invalid escape sequence
# E series are pep8
# E117 over-indented
# E126 continuation line over-indented for hanging indent
# E127 continuation line over-indented for visual indent
# E128 continuation line under-indented for visual indent
# E402 module level import not at top of file
# E741 ambiguous variable name
ignore = H101,H102,H104,H105,H306,H401,H403,H404,H405,H701,H702,H703,
B006,B007,B009,B010,B012,B014,B301
W503,W504,W605,
E117,E126,E127,E128,E402,E741
exclude = build,dist,tools,.eggs
max-line-length=120
[testenv:flake8]
deps = -r{toxinidir}/test-requirements.txt
commands =
flake8 {posargs} .
[testenv:py39]
commands =
stestr run {posargs}
stestr slowest
[testenv:pep8]
# testenv:flake8 clone
deps = -r{toxinidir}/test-requirements.txt
commands = {[testenv:flake8]commands}
[testenv:venv]
commands = {posargs}
[bandit]
# The following bandit tests are being skipped:
# B101: Test for use of assert
# B103: Test for setting permissive file permissions
# B104: Test for binding to all interfaces
# B105: Test for use of hard-coded password strings
# B108: Test for insecure usage of tmp file/directory
# B110: Try, Except, Pass detected.
# B303: Use of insecure MD2, MD4, MD5, or SHA1 hash function.
# B307: Blacklisted call to eval.
# B310: Audit url open for permitted schemes
# B311: Standard pseudo-random generators are not suitable for security/cryptographic purposes
# B314: Blacklisted calls to xml.etree.ElementTree
# B318: Blacklisted calls to xml.dom.minidom
# B320: Blacklisted calls to lxml.etree
# B404: Import of subprocess module
# B405: import xml.etree
# B408: import xml.minidom
# B410: import lxml
# B506: Test for use of yaml load
# B602: Test for use of popen with shell equals true
# B603: Test for use of subprocess without shell equals true
# B604: Test for any function with shell equals true
# B605: Test for starting a process with a shell
# B607: Test for starting a process with a partial path
# B608: Possible SQL injection vector through string-based query
#
# Note: 'skips' entry cannot be split across multiple lines
#
skips = B101,B103,B104,B105,B108,B110,B303,B307,B310,B311,B314,B318,B320,B404,B405,B408,B410,B506,B602,B603,B604,B605,B607,B608
exclude = tests
[testenv:bandit]
deps = -r{toxinidir}/test-requirements.txt
commands = bandit --ini tox.ini -n 5 -r k8sapp_node_interface_metrics_exporter
[testenv:pylint]
install_command = pip install -v -v -v \
-c{env:UPPER_CONSTRAINTS_FILE:https://opendev.org/starlingx/root/raw/branch/master/build-tools/requirements/debian/upper-constraints.txt} \
{opts} {packages}
commands =
pylint {posargs} k8sapp_node_interface_metrics_exporter --rcfile=./pylint.rc
[testenv:cover]
# not sure is passenv is still needed
passenv = CURL_CA_BUNDLE
deps = {[testenv]deps}
setenv = {[testenv]setenv}
PYTHON=coverage run --parallel-mode
commands =
{[testenv]commands}
coverage erase
stestr run {posargs}
coverage combine
coverage html -d cover
coverage xml -o cover/coverage.xml
coverage report
[testenv:pip-missing-reqs]
# do not install test-requirements as that will pollute the virtualenv for
# determining missing packages
# this also means that pip-missing-reqs must be installed separately, outside
# of the requirements.txt files
deps = pip_missing_reqs
-rrequirements.txt
commands=pip-missing-reqs -d --ignore-file=/k8sapp_node_interface_metrics_exporter/tests k8sapp_node_interface_metrics_exporter

View File

@ -20,14 +20,14 @@ export STAGING = staging
override_dh_auto_build:
# Create the helm-chart TGZ file.
#cd helm-charts && make
cd helm-charts && make
# Setup the staging directory.
mkdir -p $(STAGING)
cp files/metadata.yaml $(STAGING)
cp -Rv fluxcd-manifests/ $(STAGING)
mkdir -p $(STAGING)/charts
#cp helm-charts/*.tgz $(STAGING)/charts
cp helm-charts/*.tgz $(STAGING)/charts
# Populate metadata.
sed -i 's/@APP_NAME@/$(APP_NAME)/g' $(STAGING)/metadata.yaml
@ -36,7 +36,7 @@ override_dh_auto_build:
# Copy the plugins: installed in the buildroot
mkdir -p $(STAGING)/plugins
#cp /plugins/*.whl $(STAGING)/plugins
cp /plugins/*.whl $(STAGING)/plugins
# Prepare staging for fluxcd package
cp -R fluxcd-manifests $(STAGING)/

View File

@ -1,12 +0,0 @@
## Intel Device Plugins Operator Helm
This directory contains helm chart that need to be built for this
application. This helm chart deploys the Interface Matrics Exporter
on Kubernetes clusters.
## Source
TODO:MAYANK => Custom helm chart related info
Charts are based on Custom helm chart
## Installation
Installation of helm-chart is done automatically from the intel-device-plugins-operator-helm package.

View File

@ -2,9 +2,11 @@ app_name: @APP_NAME@
app_version: @APP_VERSION@
helm_repo: @HELM_REPO@
maintain_user_overrides: true
maintain_attributes: true
upgrades:
auto_update: true
behavior:
platform_managed_app: yes
desired_state: applied

View File

@ -3,3 +3,9 @@
#
# SPDX-License-Identifier: Apache-2.0
#
app.starlingx.io/component: platform
image:
repository: starlingx/metrics-exporter-api
tag: latest

View File

@ -15,27 +15,27 @@ CHARTS := helm-toolkit $(filter-out $(EXCLUDES), $(patsubst %/.,%,$(wildcard */.
all: $(CHARTS)
$(CHARTS):
@if [ -d $@ ]; then \
echo; \
echo "===== Processing [$@] chart ====="; \
make $(TASK)-$@; \
fi
@if [ -d $@ ]; then \
echo; \
echo "===== Processing [$@] chart ====="; \
make $(TASK)-$@; \
fi
init-%:
if [ -f $*/Makefile ]; then make -C $*; fi
if [ -f $*/requirements.yaml ]; then helm dep up $*; fi
if [ -f $*/Makefile ]; then make -C $*; fi
if [ -f $*/requirements.yaml ]; then helm dep up $*; fi
lint-%: init-%
if [ -d $* ]; then helm lint $*; fi
if [ -d $* ]; then helm lint $*; fi
build-%: lint-%
if [ -d $* ]; then helm package $*; fi
if [ -d $* ]; then helm package $*; fi
clean:
@echo "Clean all build artifacts"
rm -f */templates/_partials.tpl */templates/_globals.tpl
rm -f *tgz */charts/*tgz */requirements.lock
rm -rf */charts */tmpcharts
@echo "Clean all build artifacts"
rm -f */templates/_partials.tpl */templates/_globals.tpl
rm -f *tgz */charts/*tgz */requirements.lock
rm -rf */charts */tmpcharts
%:
@:
@:

View File

@ -0,0 +1,45 @@
# Node Interface Metricse Exporter Helm Chart
This Helm Chart comes with everything that is needed to run Node Interface
Metrics Exporter app.
## How to install
Create the namespace where Helm should install the components with
```console
$ kubectl create namespace "node-interface-metrics-exporter"
```
This chart can be installed using the default values with:
```console
$ helm upgrade --install node-interface-metrics-exporter stx-platform/node-interface-metrics-exporter
```
It is possible to replace the default "args" values of values.yaml file to
change or add new args to Node interface metrics exporter.
You may want to override values.yaml file use the following command:
```console
$ helm upgrade --install node-interface-metrics-exporter -f values.yaml stx-platform/node-interface-metrics-exporter
```
### Delete Chart
If you want to delete your Chart, use this command
```console
$ helm uninstall node-interface-metrics-exporter
```
If you want to delete the namespace, use this command
```console
$ kubectl delete namespace node-interface-metrics-exporter
```
For more information about installing and using Helm, see the
[Helm Docs](https://helm.sh/docs/). For a quick introduction to Charts,
see the [Chart Guide](https://helm.sh/docs/topics/charts/).

View File

@ -0,0 +1,55 @@
#
# Copyright (c) 2023 Wind River Systems, Inc.
#
# SPDX-License-Identifier: Apache-2.0
#
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: {{ .Values.name }}
namespace: {{ .Values.namespace }}
labels:
app: {{ .Values.labels.app }}
chart: {{ .Chart.Name }}
spec:
selector:
matchLabels:
app: {{ .Values.labels.app }}
template:
metadata:
namespace: {{ .Values.namespace }}
labels:
app: {{ .Values.labels.app }}
spec:
hostNetwork: true
imagePullSecrets:
- name: {{ .Values.imagePullSecrets}}
containers:
- name: {{ .Values.name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
env:
- name: MY_NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: MY_POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: MY_POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
resources:
limits:
cpu: 100m
memory: 200Mi
volumeMounts:
- mountPath: /data/sys
name: sys
volumes:
- hostPath:
path: /sys
type: ""
name: sys

View File

@ -0,0 +1,24 @@
#
# Copyright (c) 2023 Wind River Systems, Inc.
#
# SPDX-License-Identifier: Apache-2.0
#
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: node-interface-metrics-role
namespace: node-interface-metrics-exporter
rules:
- apiGroups:
- ""
resources:
- pods
- pods/log
verbs:
- create
- get
- list
- watch
- patch
- delete

View File

@ -0,0 +1,21 @@
#
# Copyright (c) 2023 Wind River Systems, Inc.
#
# SPDX-License-Identifier: Apache-2.0
#
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
labels:
app: ""
name: node-interface-metrics-rolebinding
namespace: node-interface-metrics-exporter
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: node-interface-metrics-role
subjects:
- kind: ServiceAccount
name: node-interface-metrics-role
namespace: node-interface-metrics-exporter

View File

@ -0,0 +1,14 @@
# Default values for node-interface-metrics-exporter.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
image:
repository: starlingx/metrics-exporter-api
tag: latest
namespace: node-interface-metrics-exporter
imagePullSecrets: default-registry-key
name: node-interface-metrics-exporter
labels:
app: nime-app

View File

@ -1,3 +1,3 @@
# hacking pulls in flake8
hacking!=0.13.0,<0.14,>=0.12.0 # Apache-2.0
hacking>=1.1.0,<=2.0.0 # Apache-2.0
bashate >= 0.2

17
tox.ini
View File

@ -5,7 +5,11 @@ skipsdist = True
sitepackages=False
[testenv]
install_command = pip install -U {opts} {packages}
basepython = python3
install_command = pip install -U \
{opts} {packages} \
-c{env:TOX_CONSTRAINTS_FILE:https://opendev.org/starlingx/root/raw/branch/master/build-tools/requirements/debian/upper-constraints.txt}
setenv =
VIRTUAL_ENV={envdir}
OS_STDOUT_CAPTURE=1
@ -18,9 +22,9 @@ deps =
allowlist_externals =
bash
passenv =
XDG_CACHE_HOME
[testenv:linters]
commands =
{[testenv:bashate]commands}
[testenv:bashate]
# Treat all E* codes as Errors rather than warnings using: -e 'E*'
@ -34,10 +38,6 @@ commands =
-print0 | xargs -r -n 1 -0 bashate -v \
-e 'E*'"
[testenv:linters]
commands =
{[testenv:bashate]commands}
[testenv:flake8]
basepython = python3
description = Dummy environment to allow flake8 to be run in subdir tox
@ -49,3 +49,4 @@ description = Dummy environment to allow pylint to be run in subdir tox
[testenv:bandit]
basepython = python3
description = Dummy environment to allow bandit to be run in subdir tox