Add first version of VES agent and vesmgr
[ric-plt/vespamgr.git] / cmd / vesmgr / vesmgr.go
1 /*
2  *  Copyright (c) 2019 AT&T Intellectual Property.
3  *  Copyright (c) 2018-2019 Nokia.
4  *
5  *  Licensed under the Apache License, Version 2.0 (the "License");
6  *  you may not use this file except in compliance with the License.
7  *  You may obtain a copy of the License at
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  *  Unless required by applicable law or agreed to in writing, software
12  *  distributed under the License is distributed on an "AS IS" BASIS,
13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *  See the License for the specific language governing permissions and
15  *  limitations under the License.
16  */
17
18 package main
19
20 import (
21         "os"
22         "os/exec"
23         mdcloggo "gerrit.o-ran-sc.org/r/com/golog.git"
24 )
25
26 type VesAgent struct {
27         Pid  int
28         name string
29 }
30
31 var vesagent VesAgent
32 var logger *mdcloggo.MdcLogger
33 var osExit = os.Exit
34
35 func init() {
36         logger, _ = mdcloggo.InitLogger("vesmgr")
37 }
38
39 /* Function to initialize vesmgr */
40 func vesmgrInit() {
41         vesagent.name = "ves-agent"
42         logger.MdcAdd("vesmgr", "0.0.1")
43         logger.Info("vesmgrInit")
44
45         /* Subscribe notifications from xAPP Mgr */
46         //subscribexAppNotifications()
47
48         // create configuration
49         f, err := os.Create("/etc/ves-agent/ves-agent.yaml")
50         if err != nil {
51                 logger.Error("Cannot create vespa conf file: %s", err.Error())
52                 return
53         }
54         defer f.Close()
55
56         createVespaConfig(f)
57
58         /* Start ves-agent */
59         ch := startVesagent()
60
61         runVesmgr(ch)
62 }
63
64 func startVesagent() chan error {
65         /* Start ves-agent */
66         cmd := exec.Command(vesagent.name, "-i", os.Getenv("VESMGR_HB_INTERVAL"), "-m", os.Getenv("VESMGR_MEAS_INTERVAL"), "-f", os.Getenv("VESMGR_PRICOLLECTOR_ADDR"), "-p", os.Getenv("VESMGR_PRICOLLECTOR_PORT"), "--Measurement.Prometheus.Address", os.Getenv("VESMGR_PROMETHEUS_ADDR"))
67         cmd.Stdout = os.Stdout
68         cmd.Stderr = os.Stderr
69         ch := make(chan error)
70         if err := cmd.Start(); err != nil {
71                 logger.Error("vesmgr exiting, ves-agent start failed: %s", err)
72                 go func() {
73                         ch <- err
74                 }()
75         } else {
76                 logger.Info("ves-agent started with pid %d", cmd.Process.Pid)
77                 vesagent.Pid = cmd.Process.Pid
78                 go func() {
79                         // wait ves-agent exit and then post the error to the channel
80                         err := cmd.Wait()
81                         ch <- err
82                 }()
83         }
84
85         return ch
86 }
87
88 func runVesmgr(ch chan error) {
89         for {
90                 err := <-ch
91                 logger.Error("Vesagent exited: " + err.Error())
92                 osExit(1)
93         }
94 }