Commit 60c8b847 authored by Muhammad Umair Khan's avatar Muhammad Umair Khan
Browse files

update meepctl core commands for multi-threading

parent 42f84d40
Loading
Loading
Loading
Loading
+24 −5
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package cmd

import (
	"fmt"
	"sync"
	"time"

	"github.com/InterDigitalInc/AdvantEDGE/go-apps/meepctl/utils"
@@ -120,9 +121,23 @@ func deleteRun(cmd *cobra.Command, args []string) {
}

func deleteApps(apps []string, cobraCmd *cobra.Command) {
	var wg sync.WaitGroup
	var printMutex sync.Mutex

	for _, app := range apps {
		k8sDelete(app, cobraCmd)
		wg.Add(1)
		go func(appName string) {
			defer wg.Done()
			output := k8sDelete(appName, cobraCmd)

			if output != "" {
				printMutex.Lock()
				fmt.Print(output)
				printMutex.Unlock()
			}
		}(app)
	}
	wg.Wait()
}

// Delete a single dep app
@@ -146,14 +161,18 @@ func deleteSingleDepApp(app string, cobraCmd *cobra.Command) {
	k8sDelete(app, cobraCmd)
}

func k8sDelete(component string, cobraCmd *cobra.Command) {
func k8sDelete(component string, cobraCmd *cobra.Command) string {
	var out string
	// If release exist
	exist, _ := utils.IsHelmRelease(component, cobraCmd)
	exist, outRel, _ := utils.IsHelmRelease(component, cobraCmd)
	out += outRel
	if exist {
		// Delete
		err := utils.HelmDelete(component, cobraCmd)
		outDel, err := utils.HelmDelete(component, cobraCmd)
		out += outDel
		if err != nil {
			fmt.Println("Helm delete failed with Error: ", err)
			out += fmt.Sprintf("Helm delete failed with Error: %v\n", err)
		}
	}
	return out
}
+57 −14
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import (
	"sort"
	"strconv"
	"strings"
	"sync"
	"time"

	"github.com/InterDigitalInc/AdvantEDGE/go-apps/meepctl/utils"
@@ -310,13 +311,35 @@ func deployCore(cobraCmd *cobra.Command) {
	// Code coverage storage
	deployCodeCovStorage(cobraCmd)

	var wg sync.WaitGroup
	var printMutex sync.Mutex

	for _, app := range deployData.coreApps {
		deploySingleApp(app, cobraCmd)
		wg.Add(1)
		go func(appName string) {
			defer wg.Done()
			output := deploySingleApp(appName, cobraCmd)
			if output != "" {
				printMutex.Lock()
				fmt.Print(output)
				printMutex.Unlock()
			}
		}(app)
	}
	wg.Wait()
}

// Deploy a single core app
func deploySingleApp(app string, cobraCmd *cobra.Command) {
func deploySingleApp(app string, cobraCmd *cobra.Command) string {
	var out string
	force, _ := cobraCmd.Flags().GetBool("force")
	exist, outRel, _ := utils.IsHelmRelease(app, cobraCmd)
	out += outRel
	if exist && !force {
		out += fmt.Sprintf("%v\n", utils.FormatWarning("Skipping "+app+": already deployed -- use [-f, --force] flag to force deployment"))
		return out
	}

	chart := deployData.gitdir + "/" + utils.RepoCfg.GetString("repo.core.go-apps."+app+".chart")
	codecov := utils.RepoCfg.GetBool("repo.core.go-apps." + app + ".codecov")
	onboardedapp := utils.RepoCfg.GetBool("repo.core.go-apps." + app + ".onboardedapp")
@@ -355,7 +378,8 @@ func deploySingleApp(app string, cobraCmd *cobra.Command) {
		coreFlags = utils.HelmFlags(coreFlags, "--set", "image.env.MEEP_HOST_URL=http://"+hostName)
	}

	k8sDeploy(app, chart, coreFlags, cobraCmd)
	out += k8sDeploy(app, chart, coreFlags, cobraCmd)
	return out
}

// Create CRDs
@@ -373,9 +397,17 @@ func createCRD(cobraCmd *cobra.Command) {
// Deploy dependencies
func deployDep(cobraCmd *cobra.Command) {
	for _, app := range deployData.depApps {
		force, _ := cobraCmd.Flags().GetBool("force")
		exist, outRel, _ := utils.IsHelmRelease(app, cobraCmd)
		fmt.Print(outRel)
		if exist && !force {
			fmt.Println(utils.FormatWarning("Skipping " + app + ": already deployed -- use [-f, --force] flag to force deployment"))
			continue
		}

		chart := deployData.gitdir + "/" + utils.RepoCfg.GetString("repo.dep."+app+".chart")
		flags := deployRunScriptsAndGetFlags(app, chart, cobraCmd)
		k8sDeploy(app, chart, flags, cobraCmd)
		fmt.Print(k8sDeploy(app, chart, flags, cobraCmd))
	}
}

@@ -397,9 +429,18 @@ func deploySingleDepApp(app string, cobraCmd *cobra.Command) {
		}
		return
	}

	force, _ := cobraCmd.Flags().GetBool("force")
	exist, outRel, _ := utils.IsHelmRelease(app, cobraCmd)
	fmt.Print(outRel)
	if exist && !force {
		fmt.Println(utils.FormatWarning("Skipping " + app + ": already deployed -- use [-f, --force] flag to force deployment"))
		return
	}

	chart := deployData.gitdir + "/" + utils.RepoCfg.GetString("repo.dep."+app+".chart")
	flags := deployRunScriptsAndGetFlags(app, chart, cobraCmd)
	k8sDeploy(app, chart, flags, cobraCmd)
	fmt.Print(k8sDeploy(app, chart, flags, cobraCmd))
}

func deployRunScriptsAndGetFlags(targetName string, chart string, cobraCmd *cobra.Command) [][]string {
@@ -786,25 +827,27 @@ func deployRunScriptsAndGetFlags(targetName string, chart string, cobraCmd *cobr
	return flags
}

func k8sDeploy(app string, chart string, flags [][]string, cobraCmd *cobra.Command) {
func k8sDeploy(app string, chart string, flags [][]string, cobraCmd *cobra.Command) string {
	var out string
	force, _ := cobraCmd.Flags().GetBool("force")

	// If release exist && --force, delete
	exist, _ := utils.IsHelmRelease(app, cobraCmd)
	exist, outRel, _ := utils.IsHelmRelease(app, cobraCmd)
	out += outRel
	if exist {
		if force {
			_ = utils.HelmDelete(app, cobraCmd)
			// Wait for K8s to clean up resources before redeploying
			fmt.Println(utils.FormatWarning("Waiting 5s for resource cleanup..."))
			time.Sleep(10 * time.Second)
			outDel, _ := utils.HelmDelete(app, cobraCmd)
			out += outDel
		} else {
			fmt.Println(utils.FormatWarning("Skipping " + app + ": already deployed -- use [-f, --force] flag to force deployment"))
			return
			out += fmt.Sprintf("%v\n", utils.FormatWarning("Skipping "+app+": already deployed -- use [-f, --force] flag to force deployment"))
			return out
		}
	}

	// Deploy
	_ = utils.HelmInstall(app, chart, flags, cobraCmd)
	outIns, _ := utils.HelmInstall(app, chart, flags, cobraCmd)
	out += outIns
	return out
}

func deployCodeCovStorage(cobraCmd *cobra.Command) {
+18 −20
Original line number Diff line number Diff line
@@ -27,20 +27,20 @@ import (
)

// IsHelmRelease  Returns true if a Helm release exists
func IsHelmRelease(name string, cobraCmd *cobra.Command) (exist bool, err error) {
func IsHelmRelease(name string, cobraCmd *cobra.Command) (exist bool, output string, err error) {
	exist = false
	verbose, _ := cobraCmd.Flags().GetBool("verbose")

	start := time.Now()
	cmd := exec.Command("helm", "ls", "--filter", name, "--short")
	if verbose {
		fmt.Println("Cmd:", cmd.Args)
		output += fmt.Sprintf("Cmd: %v\n", cmd.Args)
	}
	out, err := cmd.CombinedOutput()
	elapsed := time.Since(start)
	if err != nil {
		err = errors.New("Error listing component [" + name + "]")
		fmt.Println(err)
		output += fmt.Sprintf("%v\n", err)
	} else {
		s := string(out)
		lines := strings.Split(s, "\n")
@@ -53,40 +53,38 @@ func IsHelmRelease(name string, cobraCmd *cobra.Command) (exist bool, err error)
	}
	if verbose {
		r := FormatResult("Result: "+string(out), elapsed, cobraCmd)
		fmt.Println(r)
		output += fmt.Sprintf("%v\n", r)
	}

	return exist, err
	return exist, output, err
}

// HelmDelete  Deletes specified release
func HelmDelete(name string, cobraCmd *cobra.Command) (err error) {
func HelmDelete(name string, cobraCmd *cobra.Command) (output string, err error) {
	verbose, _ := cobraCmd.Flags().GetBool("verbose")

	start := time.Now()
	cmd := exec.Command("helm", "uninstall", name)
	cmd := exec.Command("helm", "uninstall", name, "--wait")
	if verbose {
		fmt.Println("Cmd:", cmd.Args)
		output += fmt.Sprintf("Cmd: %v\n", cmd.Args)
	}
	out, err := cmd.CombinedOutput()
	elapsed := time.Since(start)

	if err != nil {
		err = errors.New("Error deleting component [" + name + "]")
		fmt.Println(err)
		output += fmt.Sprintf("%v\n", err)
	} else {
		r := FormatResult("Deleted "+name, elapsed, cobraCmd)
		fmt.Println(r)
		output += fmt.Sprintf("%v\n", r)
	}
	if verbose {
		fmt.Println("Result: " + string(out))
		output += fmt.Sprintf("Result: %v\n", string(out))
	}

	return err
	return output, err
}

// HelmInstall Install specified releases
func HelmInstall(name string, chart string, flags [][]string, cobraCmd *cobra.Command) (err error) {
func HelmInstall(name string, chart string, flags [][]string, cobraCmd *cobra.Command) (output string, err error) {
	verbose, _ := cobraCmd.Flags().GetBool("verbose")

	start := time.Now()
@@ -96,21 +94,21 @@ func HelmInstall(name string, chart string, flags [][]string, cobraCmd *cobra.Co
		cmd.Args = append(cmd.Args, f[1])
	}
	if verbose {
		fmt.Println("Cmd:", cmd.Args)
		output += fmt.Sprintf("Cmd: %v\n", cmd.Args)
	}
	out, err := cmd.CombinedOutput()
	elapsed := time.Since(start)
	if err != nil {
		err = errors.New("Error installing component [" + name + "]")
		fmt.Println(err)
		output += fmt.Sprintf("%v\n", err)
	} else {
		r := FormatResult("Deployed "+name, elapsed, cobraCmd)
		fmt.Println(r)
		output += fmt.Sprintf("%v\n", r)
	}
	if verbose {
		fmt.Println("Result: " + string(out))
		output += fmt.Sprintf("Result: %v\n", string(out))
	}
	return err
	return output, err
}

// HelmFlags Takes helm flag & value pair and formats it into an array of flag value pair