Commit 4e2e6562 authored by Kevin Di Lallo's avatar Kevin Di Lallo
Browse files

helm concurrency support in virt-engine

parent 777ab8a6
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import (
	"fmt"
	"net/http"
	"os"
	"sort"
	"strings"

	dkm "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-data-key-mgr"
@@ -508,6 +509,11 @@ func meGetStates(w http.ResponseWriter, r *http.Request) {
		data.AllPodsStatus.PodStatus = append(data.AllPodsStatus.PodStatus, *podStatus)
	}

	// Sort pod status slice by name
	sort.Slice(data.AllPodsStatus.PodStatus, func(i, j int) bool {
		return data.AllPodsStatus.PodStatus[i].Name < data.AllPodsStatus.PodStatus[j].Name
	})

	w.Header().Set("Content-Type", "application/json; charset=UTF-8")

	// Format response
+2 −1
Original line number Diff line number Diff line
@@ -24,13 +24,14 @@ import (

func deleteReleases(charts []Chart) error {
	for _, c := range charts {
		go deleteRelease(c)
		deleteRelease(c)
	}

	return nil
}

func deleteRelease(chart Chart) {
	log.Debug("Deleting release: " + chart.ReleaseName)
	var cmd = exec.Command("helm", "delete", chart.ReleaseName, "--purge")
	out, err := cmd.CombinedOutput()
	if err != nil {
+2 −38
Original line number Diff line number Diff line
@@ -16,20 +16,6 @@

package helm

import (
	"fmt"

	log "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger"
)

const (
	StateIdle       = "IDLE"
	StateInstalling = "INSTALLING"
	StateDeleting   = "DELETING"
)

var state string = StateIdle

func GetReleasesName() ([]Release, error) {
	return getReleasesName()
}
@@ -39,31 +25,9 @@ func GetReleases() ([]Release, error) {
}

func InstallCharts(charts []Chart) error {
	if state == StateIdle {
		state = StateInstalling
		go func() {
			log.Debug("Installing ", len(charts), " Charts...")
			_ = installCharts(charts)
			log.Debug("Charts installed (", len(charts), ")")
			state = StateIdle
		}()
		return nil
	}
	err := fmt.Errorf("Service busy [%s]", state)
	return err
	return runTask(Install, charts)
}

func DeleteReleases(charts []Chart) error {
	if state == StateIdle {
		state = StateDeleting
		go func() {
			log.Debug("Deleting ", len(charts), " Releases...")
			_ = deleteReleases(charts)
			log.Debug("Releases deleted (", len(charts), ")")
			state = StateIdle
		}()
		return nil
	}
	err := fmt.Errorf("Service busy [%s]", state)
	return err
	return runTask(Delete, charts)
}
+35 −32
Original line number Diff line number Diff line
@@ -29,13 +29,18 @@ func installCharts(charts []Chart) error {
	if err != nil {
		return err
	}
	err = install(charts)

	for _, chart := range charts {
		err := install(chart)
		if err != nil {
		// Cleanup release
			log.Info("Cleaning installed releases")
			cleanReleases(charts)
	}
			return err
		}
	}

	return nil
}

func ensureReleases(charts []Chart) error {
	// ensure that releases do not already exist
@@ -52,32 +57,31 @@ func ensureReleases(charts []Chart) error {
	return nil
}

func install(charts []Chart) error {
	for _, c := range charts {
func install(chart Chart) error {
	log.Debug("Installing chart: " + chart.ReleaseName)
	var cmd *exec.Cmd
		if strings.Trim(c.ValuesFile, " ") == "" {
	if strings.Trim(chart.ValuesFile, " ") == "" {
		cmd = exec.Command("helm", "install",
				"--name", c.ReleaseName,
				"--namespace", c.Namespace,
				"--set", "nameOverride="+c.Name,
				"--set", "fullnameOverride="+c.Name,
				c.Location, "--replace")
			"--name", chart.ReleaseName,
			"--namespace", chart.Namespace,
			"--set", "nameOverride="+chart.Name,
			"--set", "fullnameOverride="+chart.Name,
			chart.Location, "--replace")
	} else {
		cmd = exec.Command("helm", "install",
				"--name", c.ReleaseName,
				"--namespace", c.Namespace,
				"--set", "nameOverride="+c.Name,
				"--set", "fullnameOverride="+c.Name,
				"-f", c.ValuesFile,
				c.Location, "--replace")
			"--name", chart.ReleaseName,
			"--namespace", chart.Namespace,
			"--set", "nameOverride="+chart.Name,
			"--set", "fullnameOverride="+chart.Name,
			"-f", chart.ValuesFile,
			chart.Location, "--replace")
	}
	out, err := cmd.CombinedOutput()
	if err != nil {
			log.Error("Failed to install Release [" + c.ReleaseName + "] at " + c.Location)
		log.Error("Failed to install Release [" + chart.ReleaseName + "] at " + chart.Location)
		log.Error("Error(", err.Error(), "): ", string(out))
		return err
	}
	}
	return nil
}

@@ -85,7 +89,6 @@ func cleanReleases(charts []Chart) {
	var toClean []Chart
	var cnt int
	releases, _ := GetReleasesName()
	// ensure that releases do not exist

	for _, c := range charts {
		for _, r := range releases {
@@ -97,6 +100,6 @@ func cleanReleases(charts []Chart) {
	}

	if cnt > 0 {
		_ = DeleteReleases(toClean)
		_ = deleteReleases(toClean)
	}
}
+67 −0
Original line number Diff line number Diff line
/*
 * Copyright (c) 2020  InterDigital Communications, Inc
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package helm

import (
	log "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger"
)

type Task string

const (
	Install Task = "INSTALL"
	Delete  Task = "DELETE"
)

type Job struct {
	task   Task
	charts []Chart
}

var queue *chan Job = nil

func startWorker() {
	if queue != nil {
		return
	}
	queueChan := make(chan Job, 5)
	queue = &queueChan

	go func() {
		for job := range queueChan {
			switch job.task {
			case Install:
				log.Debug("Installing ", len(job.charts), " Charts...")
				_ = installCharts(job.charts)
				log.Debug("Charts installed (", len(job.charts), ")")

			case Delete:
				log.Debug("Deleting ", len(job.charts), " Releases...")
				_ = deleteReleases(job.charts)
				log.Debug("Releases deleted (", len(job.charts), ")")
			}
		}
		queue = nil
	}()
}

func runTask(task Task, charts []Chart) error {
	startWorker()
	var job Job = Job{task: task, charts: charts}
	*queue <- job
	return nil
}
Loading