Commit cb83efa4 authored by Kevin Di Lallo's avatar Kevin Di Lallo
Browse files

support for adding & modifying scenario nodes

parent 7c0df8ea
Loading
Loading
Loading
Loading
+25 −25
Original line number Diff line number Diff line
@@ -128,14 +128,11 @@ type SandboxTemplate struct {
	AuthEnabled    bool
}

// Service map
var serviceMap map[string]string

// Deploy - Generate charts & deploy
func Deploy(sandboxName string, model *mod.Model) error {
// Deploy - Generate charts & deploy single process or entire scenario
func Deploy(sandboxName string, procName string, model *mod.Model) error {

	// Create scenario charts
	charts, err := generateScenarioCharts(sandboxName, model)
	charts, err := generateScenarioCharts(sandboxName, procName, model)
	if err != nil {
		log.Debug("Error creating scenario charts: ", err)
		return err
@@ -152,13 +149,19 @@ func Deploy(sandboxName string, model *mod.Model) error {
	return nil
}

func generateScenarioCharts(sandboxName string, model *mod.Model) (charts []helm.Chart, err error) {
	serviceMap = map[string]string{}
func generateScenarioCharts(sandboxName string, procName string, model *mod.Model) (charts []helm.Chart, err error) {
	serviceMap := map[string]string{}

	procNames := model.GetNodeNames("CLOUD-APP")
	procNames = append(procNames, model.GetNodeNames("EDGE-APP")...)
	procNames = append(procNames, model.GetNodeNames("UE-APP")...)
	for _, name := range procNames {
		// Check if single process is being added
		if procName != "" && name != procName {
			continue
		}

		// Retrieve node process information from model
		node := model.GetNode(name)
		if node == nil {
			err = errors.New("Error finding process: " + name)
@@ -349,7 +352,7 @@ func generateScenarioCharts(sandboxName string, model *mod.Model) (charts []helm

			// Create virt-engine chart
			chartName := proc.Name
			chartLocation, err := createChart(chartName, sandboxName, scenarioName, scenarioTemplate)
			chartLocation, _, err := createChart(chartName, sandboxName, scenarioName, scenarioTemplate)
			if err != nil {
				log.Debug("yaml creation file process: ", err)
				return nil, err
@@ -366,14 +369,6 @@ func generateScenarioCharts(sandboxName string, model *mod.Model) (charts []helm
// Create ME Svc chart
func createMeSvcChart(sandboxName string, scenarioName string, meSvcName string, ports []ServicePortTemplate) (*helm.Chart, error) {

	// Ignore if chart already exists
	if _, found := serviceMap[meSvcName]; found {
		return nil, nil
	}

	// Add ME Svc to map
	serviceMap[meSvcName] = "meepMeSvc: " + meSvcName

	// Create default scenario template
	var scenarioTemplate ScenarioTemplate
	serviceTemplate := &scenarioTemplate.Service
@@ -392,11 +387,15 @@ func createMeSvcChart(sandboxName string, scenarioName string, meSvcName string,

	// Create virt-engine chart for new group service
	chartName := "me-svc-" + meSvcName
	chartLocation, err := createChart(chartName, sandboxName, scenarioName, scenarioTemplate)
	chartLocation, isNew, err := createChart(chartName, sandboxName, scenarioName, scenarioTemplate)
	if err != nil {
		log.Debug("yaml creation file process: ", err)
		return nil, err
	}
	if !isNew {
		log.Debug("Ignoring existing chart")
		return nil, nil
	}
	c := newChart(chartName, sandboxName, scenarioName, chartLocation, "")
	return &c, nil
}
@@ -409,11 +408,11 @@ func deployCharts(charts []helm.Chart, sandboxName string) error {
	return nil
}

func createChart(chartName string, sandboxName string, scenarioName string, templateData interface{}) (string, error) {
func createChart(chartName string, sandboxName string, scenarioName string, templateData interface{}) (outChart string, isNew bool, err error) {
	isNew = true

	// Determine source templates & destination chart location
	var templateChart string
	var outChart string
	if scenarioName == "" {
		templateChart = "/templates/sandbox/" + chartName
		outChart = "/charts/" + sandboxName + "/sandbox/" + chartName
@@ -428,13 +427,14 @@ func createChart(chartName string, sandboxName string, scenarioName string, temp
	t, err := template.ParseFiles(templateValues)
	if err != nil {
		log.Error(err)
		return "", err
		return "", isNew, err
	}

	// Remove old chart if it already exists
	if _, err := os.Stat(outChart); err == nil {
		log.Debug("Removing old chart from path: ", outChart)
		os.RemoveAll(outChart)
		isNew = false
	}

	// Create new chart folder
@@ -445,18 +445,18 @@ func createChart(chartName string, sandboxName string, scenarioName string, temp
	f, err := os.Create(outValues)
	if err != nil {
		log.Debug("create file: ", err)
		return "", err
		return "", isNew, err
	}

	// Fill new chart values file using template data
	err = t.Execute(f, templateData)
	if err != nil {
		log.Debug("execute: ", err)
		return "", err
		return "", isNew, err
	}

	f.Close()
	return outChart, nil
	return outChart, isNew, nil
}

func newChart(chartName string, sandboxName string, scenarioName string, chartLocation string, valuesFile string) helm.Chart {
@@ -581,7 +581,7 @@ func generateSandboxCharts(sandboxName string) (charts []helm.Chart, err error)
	// Create sandbox charts
	for pod := range ve.sboxPods {
		var chartLocation string
		chartLocation, err = createChart(pod, sandboxName, "", sandboxTemplate)
		chartLocation, _, err = createChart(pod, sandboxName, "", sandboxTemplate)
		if err != nil {
			return
		}
+35 −4
Original line number Diff line number Diff line
@@ -214,7 +214,7 @@ func activateScenario(sandboxName string) {
	ve.activeScenarioNames[sandboxName] = activeModel.GetScenarioName()

	// Deploy scenario
	err := Deploy(sandboxName, activeModel)
	err := Deploy(sandboxName, "", activeModel)
	if err != nil {
		log.Error("Error creating charts: ", err)
		return
@@ -234,9 +234,18 @@ func addScenarioNode(sandboxName string, nodeName string) {
	// Sync with active scenario store
	activeModel.UpdateScenario()

	// Find process in active scenario

	// Create chart template
	// Deploy single process
	nodeType := activeModel.GetNodeType(nodeName)
	if mod.IsProc(nodeType) {
		err := Deploy(sandboxName, nodeName, activeModel)
		if err != nil {
			log.Error("Error creating charts: ", err)
			return
		}
	} else {
		log.Error("Unsupported node type: ", nodeType)
		return
	}
}

func modifyScenarioNode(sandboxName string, nodeName string) {
@@ -249,8 +258,30 @@ func modifyScenarioNode(sandboxName string, nodeName string) {
		return
	}

	// Get cached scenario name
	scenarioName := ve.activeScenarioNames[sandboxName]

	// Sync with active scenario store
	activeModel.UpdateScenario()

	// Handle process updates only
	nodeType := activeModel.GetNodeType(nodeName)
	if mod.IsProc(nodeType) {

		// Remove existing process
		_, chartsToDelete := deleteReleases(sandboxName, scenarioName, nodeName)
		log.Info("Number of charts to be deleted: ", chartsToDelete)

		// Add updated process
		err := Deploy(sandboxName, nodeName, activeModel)
		if err != nil {
			log.Error("Error creating charts: ", err)
			return
		}
	} else {
		log.Error("Unsupported node type: ", nodeType)
		return
	}
}

func removeScenarioNode(sandboxName string, nodeName string) {