Commit 755ae833 authored by Michel Roy's avatar Michel Roy Committed by Kevin Di Lallo
Browse files

model update

parent 49fc6cea
Loading
Loading
Loading
Loading
+31 −15
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package model
import (
	"encoding/json"
	"errors"
	"fmt"
	"reflect"
	"strings"

@@ -27,8 +28,13 @@ import (
	redis "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-redis"
)

const activeScenarioEvents = "activeScenarioEvents"
const activeScenarioKey = "activeScenarioKey"
// const activeScenarioEvents = "activeScenarioEvents"
const activeScenarioEvents = "ctrl-engine-active"

// const activeScenarioKey = "activeScenarioKey"
const activeScenarioKey = "ctrl-engine:active"

const DbAddress = "meep-redis-master:6379"

var redisTable = 0

@@ -38,7 +44,8 @@ type Model struct {
	module        string
	active        bool
	subscribed    bool
	activeChannel string
	ActiveChannel string
	activeKey     string
	listener      func(string, string)
	rc            *redis.Connector
	scenario      *ceModel.Scenario
@@ -64,7 +71,8 @@ func NewModel(dbAddr string, module string, name string) (m *Model, err error) {
	m.module = module
	m.active = false
	m.subscribed = false
	m.activeChannel = activeScenarioEvents
	m.ActiveChannel = activeScenarioEvents
	m.activeKey = activeScenarioKey
	m.scenario = new(ceModel.Scenario)
	m.nodeMap = NewNodeMap()
	m.parseNodes()
@@ -77,7 +85,7 @@ func NewModel(dbAddr string, module string, name string) (m *Model, err error) {
		log.Error(err)
		return nil, err
	}
	log.Debug("Model created ", m.name)
	log.Debug("[", m.module, "] Model created ", m.name)
	return m, nil
}

@@ -112,12 +120,12 @@ func (m *Model) Activate() (err error) {
		log.Error(err.Error())
		return err
	}
	err = m.rc.JSONSetEntry(activeScenarioKey, ".", string(jsonScenario))
	err = m.rc.JSONSetEntry(m.activeKey, ".", string(jsonScenario))
	if err != nil {
		log.Error(err.Error())
		return err
	}
	err = m.rc.Publish(m.activeChannel, "")
	err = m.rc.Publish(m.ActiveChannel, "")
	if err != nil {
		log.Error(err.Error())
		return err
@@ -130,12 +138,12 @@ func (m *Model) Activate() (err error) {
func (m *Model) Deactivate() (err error) {
	if m.active == true {
		m.active = false
		err = m.rc.JSONDelEntry(activeScenarioKey, ".")
		err = m.rc.JSONDelEntry(m.activeKey, ".")
		if err != nil {
			log.Error(err.Error())
			return err
		}
		err = m.rc.Publish(m.activeChannel, "")
		err = m.rc.Publish(m.ActiveChannel, "")
		if err != nil {
			log.Error(err.Error())
			return err
@@ -151,7 +159,7 @@ func (m *Model) Listen(handler func(string, string)) (err error) {
	}
	if !m.subscribed {
		// Subscribe to Pub-Sub events for MEEP Controller
		err = m.rc.Subscribe(m.activeChannel)
		err = m.rc.Subscribe(m.ActiveChannel)
		if err != nil {
			log.Error("Failed to subscribe to Pub/Sub events. Error: ", err)
			return err
@@ -165,6 +173,9 @@ func (m *Model) Listen(handler func(string, string)) (err error) {
		go func() {
			_ = m.rc.Listen(m.internalListener)
		}()

		// Generate first event to initialize
		m.internalListener(m.ActiveChannel, "")
	}
	return nil
}
@@ -284,8 +295,12 @@ func (m *Model) UpdateNetChar(nc *ceModel.EventNetworkCharacteristicsUpdate) (er

//GetScenarioName - Get the scenario name
func (m *Model) GetScenarioName() string {
	fmt.Printf("%+v", m)
	if m.scenario != nil {
		return m.scenario.Name
	}
	return ""
}

//GetNodeNames - Get the list of nodes of a certain type; "" or "ANY" returns all
func (m *Model) GetNodeNames(typ string) []string {
@@ -395,7 +410,7 @@ func (m *Model) updateSvcMap() (err error) {

func (m *Model) refresh() (err error) {
	if m.active == true {
		err = m.rc.JSONDelEntry(activeScenarioKey, ".")
		err = m.rc.JSONDelEntry(m.activeKey, ".")
		if err != nil {
			log.Error(err.Error())
			return err
@@ -405,12 +420,12 @@ func (m *Model) refresh() (err error) {
			log.Error(err.Error())
			return err
		}
		err = m.rc.JSONSetEntry(activeScenarioKey, ".", string(jsonScenario))
		err = m.rc.JSONSetEntry(m.activeKey, ".", string(jsonScenario))
		if err != nil {
			log.Error(err.Error())
			return err
		}
		err = m.rc.Publish(m.activeChannel, "")
		err = m.rc.Publish(m.ActiveChannel, "")
		if err != nil {
			log.Error(err.Error())
			return err
@@ -524,9 +539,10 @@ func (m *Model) moveProc(node *Node, destName string) (oldLocName string, newLoc
func (m *Model) internalListener(channel string, payload string) {
	// An update was received - Update the object state and call the external Handler
	// Retrieve active scenario from DB
	j, err := m.rc.JSONGetEntry(activeScenarioKey, ".")
	j, err := m.rc.JSONGetEntry(m.activeKey, ".")
	log.Debug("Scenario Event:", j)
	if err != nil {
		log.Debug("Scenario was deleted, create a new one")
		// Scenario was deleted
		m.scenario = new(ceModel.Scenario)
		m.nodeMap = NewNodeMap()
+18 −20
Original line number Diff line number Diff line
@@ -609,6 +609,21 @@ func TestListenModel(t *testing.T) {
		t.Errorf("Scenario name should be empty")
	}

	fmt.Println("Activate")
	mPub.Activate()
	time.Sleep(50 * time.Millisecond)

	fmt.Println("Set Model")
	err = mPub.SetScenario([]byte(testScenario))
	time.Sleep(50 * time.Millisecond)
	if err != nil {
		t.Errorf("Error setting model")
	}
	if mPub.GetScenarioName() != "demo1" {
		t.Errorf("Scenario name should be demo1")
	}

	// create listener after model has been published to test initialization
	fmt.Println("Create Listener")
	mLis, err := NewModel(modelRedisAddr, moduleName+"-Lis", "Active")
	if err != nil {
@@ -624,28 +639,14 @@ func TestListenModel(t *testing.T) {
		t.Errorf("Should not allow registering without a handler")
	}

	fmt.Println("Register listener")
	err = mLis.Listen(eventHandler)
	if err != nil {
		t.Errorf("Unable to listen for events")
	}

	var testCount = 0
	eventCount = 0
	fmt.Println("Activate")
	testCount++
	mPub.Activate()
	time.Sleep(50 * time.Millisecond)
	if eventCount != testCount {
		t.Errorf("No event received for Activate")
	}

	fmt.Println("Set Model")
	fmt.Println("Register listener")
	testCount++
	err = mPub.SetScenario([]byte(testScenario))
	time.Sleep(50 * time.Millisecond)
	err = mLis.Listen(eventHandler)
	if err != nil {
		t.Errorf("Error setting model")
		t.Errorf("Unable to listen for events")
	}
	if eventCount != testCount {
		t.Errorf("No event received for SetScenario")
@@ -655,9 +656,6 @@ func TestListenModel(t *testing.T) {
	if string(lis) != string(pub) {
		t.Errorf("Published model different than received one")
	}
	if mPub.GetScenarioName() != "demo1" {
		t.Errorf("Scenario name should be demo1")
	}
	if mLis.GetScenarioName() != "demo1" {
		t.Errorf("Scenario name should be demo1")
	}