Kubernetes dashboard installation stage

-Add a new stage that install Kubernetes
dashboard and saves a file with the access
token in the $HOME of the user.
-Change config files folder structure.

Test Plan:
PASS: kubernetes dashboard is successfully initiated
PASS: token.txt is sent to $HOME

Story: 2005051
Task: 47937

Change-Id: Id5a872e14c2620e6064e8593ce28d177a113ffaf
Signed-off-by: Daniel Caires <daniel.caires@encora.com>
This commit is contained in:
Daniel Caires 2023-06-29 13:15:46 -03:00 committed by Lindley Werner
parent 56aeb98f07
commit 0fce663636
9 changed files with 156 additions and 6 deletions

View File

@ -190,6 +190,14 @@ def parse_config_location(parser: ArgumentParser):
Path to the config file to use
""",
action='append')
parser.add_argument("--kubernetes-config-files", help=
"""
Path to a local YAML files (admin-login.yaml and
dashboard-values.yml) that will be copied to the
home directory of the controller-0 for the kubernetes
dashboard instalation and configuration.
""",
type=str)
def parse_disk_info(parser: ArgumentParser):
@ -284,6 +292,21 @@ def parse_networking(parser: ArgumentParser):
installed.
""",
type=str)
parser.add_argument("--horizon-dashboard-port", help=
"""
Port for the visualization of the StarlingX
Horizon dashboard. If no port value is set, it defaults to port 8080
""",
type=str,
default='8080')
parser.add_argument("--kubernetes-dashboard-port", help=
"""
Port for the visualization of the kubernetes
dashboard. If no port value is set, it default
to port 32000
""",
type=str,
default='32000')
def parse_custom_scripts(parser: ArgumentParser):

View File

@ -129,7 +129,6 @@ will be configured and used.
```shell
VBoxManage natnetwork add --netname NatNetwork --network 10.10.10.0/24 --dhcp off --ipv6 on
VBoxManage natnetwork modify --netname NatNetwork --port-forward-4 http-8080:tcp:[]:8080:[10.10.10.3]:8080
```
3. Checkout the repository, and set up Python's Virtual Environment with:
@ -163,8 +162,9 @@ running it):
--setup-type AIO-SX \
--iso-location "$HOME/Downloads/stx-8.iso" \
--labname StarlingX --install-mode serial \
--config-files-dir ./configs/aio-sx/ \
--ansible-controller-config ./configs/aio-sx/localhost.yml \
--config-files-dir ./config/labSetupFiles/ \
--ansible-controller-config ./config/ansibleFiles/localhost.yml \
--kubernetes-config-files ./config/kubeFiles/ \
--vboxnet-type nat \
--vboxnet-name NatNetwork \
--nat-controller0-local-ssh-port 3122 \

View File

@ -0,0 +1,28 @@
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kube-system
---
apiVersion: v1
kind: Secret
type: kubernetes.io/service-account-token
metadata:
name: admin-user-sa-token
namespace: kube-system
annotations:
kubernetes.io/service-account.name: admin-user
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
kind: ServiceAccount
name: admin-user
namespace: kube-system

View File

@ -0,0 +1,12 @@
---
service:
type: NodePort
nodePort: 32000
rbac:
create: true
clusterAdminRole: true
serviceAccount:
create: true
name: kubernetes-dashboard

View File

@ -421,6 +421,12 @@ def create_lab(m_vboxoptions):
if 'controller-0' in node:
local_port = m_vboxoptions.nat_controller0_local_ssh_port
ip_addr = m_vboxoptions.controller0_ip
# Add port forward rule for StarlingX dashboard visualization at 8080
rule_name = m_vboxoptions.labname + "-horizon-dashbord"
vboxmanage.vboxmanage_port_forward(rule_name,
m_vboxoptions.vboxnet_name, local_port=m_vboxoptions.horizon_dashboard_port, guest_port='8080', guest_ip=ip_addr)
elif 'controller-1' in node:
local_port = m_vboxoptions.nat_controller1_local_ssh_port
ip_addr = m_vboxoptions.controller1_ip
@ -940,7 +946,6 @@ def stage_config_controller(stream): # pylint: disable=too-many-locals
#Update localhost.yml with system password
new_config_ansible = override_ansible_become_pass()
#Send Ansible configuration file to VM
LOG.info("Copying Ansible configuration file")
destination_ansible = f'/home/{V_BOX_OPTIONS.username}/localhost.yml'
@ -1352,6 +1357,79 @@ def stage_unlock_workers(ssh_client):
wait_for_hosts(ssh_client, hosts, 'available')
@connect_to_ssh
def stage_enable_kubernetes(ssh_client):
ip_addr, port = get_ssh_ip_and_port()
local_path = V_BOX_OPTIONS.kubernetes_config_files
send_dir(
{
"source": local_path,
"remote_host": ip_addr,
"remote_port": port,
"destination":'/home/' + V_BOX_OPTIONS.username + '/',
"username": V_BOX_OPTIONS.username, "password": V_BOX_OPTIONS.password
}
)
LOG.info("###### Adding port-forward rule for kubernetes dashboard ######")
# Add port forward rule for Kubernetes dashboard visualization at 32000
ip_addr = V_BOX_OPTIONS.controller0_ip
rule_name = V_BOX_OPTIONS.labname + "-kubernetes-dasboard"
vboxmanage.vboxmanage_port_forward(rule_name, V_BOX_OPTIONS.vboxnet_name,
local_port=V_BOX_OPTIONS.kubernetes_dashboard_port,
guest_port='32000', guest_ip=ip_addr)
LOG.info("###### Installing Kubernetes dashboard ######")
_, _, exitcode = run_ssh_cmd(ssh_client,
'source /etc/platform/openrc && '
'source /etc/profile && '
'cp /etc/kubernetes/admin.conf ~/.kube/config && '
'helm repo update; helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/ && '
'helm install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard -f dashboard-values.yaml', timeout=60)
if exitcode == 0:
LOG.info("###### Creating an admin-user service account with cluster-admin provileges ######")
_, _, exitcode2 = run_ssh_cmd(ssh_client,
'kubectl apply -f admin-login.yaml && kubectl -n kube-system '
'describe secret $(kubectl get secret | grep admin-user-sa-token | awk "{print $1}") | tee $HOME/token.txt', timeout=60)
if exitcode2 == 0:
send_token()
LOG.info('##### TOKEN CREATED AND FILE CONTAINING TOKEN SENT TO HOST AT /home/%s #####', getpass.getuser())
if exitcode != 0 or exitcode2 != 0:
msg = f'Installation of Kubernetes dashboard failed, expecting exit code of 0 but got {exitcode}.'
LOG.info(msg)
raise Exception(msg)
def send_token():
LOG.info('###### Sending token.txt to /home/%s ######', getpass.getuser())
ip_addr, port = get_ssh_ip_and_port()
username =V_BOX_OPTIONS.username
password = V_BOX_OPTIONS.password
source = f'/home/{username}/token.txt'
destination = f'/home/{getpass.getuser()}'
# Send token file to HOME/Desktop using rsync
LOG.info("###### rsync command ######")
cmd = (f'rsync -avL --rsh="/usr/bin/sshpass -p {password} '
f'ssh -p {port} -o StrictHostKeyChecking=no -l {username}" '
f'{username}@{ip_addr}:{source}* {destination}')
LOG.info('CMD: %s', cmd)
with subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE) as process:
for line in iter(process.stdout.readline, b''):
LOG.info("%s", line.decode("utf-8").strip())
process.wait()
if process.returncode:
raise Exception(f'Error in rsync, return code: {process.returncode}')
def run_custom_script(script, timeout, console, mode):
"""
Run a custom script on the environment.
@ -1553,6 +1631,7 @@ STG_UNLOCK_STORAGES = "unlock-storages"
STG_LAB_SETUP4 = "lab-setup4"
STG_UNLOCK_WORKERS = "unlock-workers"
STG_LAB_SETUP5 = "lab-setup5"
STG_ENABLE_KUBERNETES = "enable-kubernetes"
STG_CUSTOM_SCRIPT1 = "custom-script1"
STG_CUSTOM_SCRIPT2 = "custom-script2"
STG_CUSTOM_SCRIPT3 = "custom-script3"
@ -1612,6 +1691,9 @@ STAGE_CALLBACKS = {
STG_LAB_SETUP5:
{CALLBACK: stage_lab_setup5,
HELP: "Run lab_setup with one or more --lab-setup-conf files from controller-0."},
STG_ENABLE_KUBERNETES:
{CALLBACK: stage_enable_kubernetes,
HELP: "Installation and configuration of Kubernetes dashboard"},
STG_CUSTOM_SCRIPT1:
{CALLBACK: stage_custom_script1,
HELP: "Run a custom script from /home/wrsroot, make sure you" \
@ -1653,6 +1735,7 @@ AVAILABLE_STAGES = [STG_CREATE_LAB,
STG_LAB_SETUP4,
STG_UNLOCK_WORKERS,
STG_LAB_SETUP5,
STG_ENABLE_KUBERNETES,
STG_CUSTOM_SCRIPT1,
STG_CUSTOM_SCRIPT2,
STG_CUSTOM_SCRIPT3,
@ -1668,6 +1751,7 @@ AIO_SX_STAGES = [
STG_RSYNC_CONFIG,
STG_LAB_SETUP1,
STG_UNLOCK_CONTROLLER0,
STG_ENABLE_KUBERNETES,
]
AIO_DX_STAGES = [
@ -1681,6 +1765,7 @@ AIO_DX_STAGES = [
STG_LAB_SETUP2,
STG_UNLOCK_CONTROLLER1,
STG_LAB_SETUP3,
STG_ENABLE_KUBERNETES,
]
STD_STAGES = [
@ -1694,7 +1779,8 @@ STD_STAGES = [
STG_LAB_SETUP2,
STG_UNLOCK_CONTROLLER1,
STG_LAB_SETUP3,
STG_UNLOCK_WORKERS
STG_UNLOCK_WORKERS,
STG_ENABLE_KUBERNETES,
]
STORAGE_STAGES = [
@ -1711,7 +1797,8 @@ STORAGE_STAGES = [
STG_UNLOCK_STORAGES,
STG_LAB_SETUP4,
STG_UNLOCK_WORKERS,
STG_LAB_SETUP5
STG_LAB_SETUP5,
STG_ENABLE_KUBERNETES,
]
AIO_SX = 'AIO-SX'