summaryrefslogtreecommitdiff
path: root/doDaemon.go
blob: 2a82b4875c0b5e485fb951edd41739550b1c415d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
// Copyright 2024 WIT.COM Inc Licensed GPL 3.0

package main

import (
	"fmt"
	"time"

	"go.wit.com/lib/protobuf/virtpb"
	"go.wit.com/lib/virtigolib"
	"go.wit.com/log"
)

func doDaemon() error {
	// set defaults
	me.unstable = time.Now() // initialize the grid as unstable
	me.changed = false
	me.hmap = make(map[*virtpb.Hypervisor]*HyperT)

	// how long a droplet can be missing until it's declared dead
	me.unstableTimeout = 17 * time.Second
	me.missingDropletTimeout = time.Minute // not sure the difference between these values

	// how often to poll the hypervisors
	me.hyperPollDelay = 5 * time.Second

	// how long the cluster must be stable before new droplets can be started
	me.clusterStableDuration = 37 * time.Second

	me.cluster = virtpb.InitCluster()
	if err := me.cluster.ConfigLoad(); err != nil {
		log.Info("config load error", err)
		log.Info("")
		log.Info("You have never run this before")
		log.Info("init example cloud here")
		log.Sleep(2)
		return err
	}

	loop := me.cluster.DropletsAll() // get the list of droplets
	for loop.Scan() {
		d := loop.Next()
		if d == nil {
			fmt.Println("d == nil")
			return fmt.Errorf("d == nil")
		}
		fmt.Println("Droplet UUID:", d.Uuid)
		if d.Current == nil {
			d.Current = new(virtpb.Current)
		}
		d.SetState(virtpb.DropletState_OFF)
		log.Info("droplet", d.Hostname)
	}
	hmm := "pihole.wit.com"
	d := me.cluster.FindDropletByName(hmm)
	if d == nil {
		log.Info("did not find found droplet", hmm)
	} else {
		log.Info("found droplet", d.Hostname, d)
	}

	var newEvents []*virtpb.Event

	// sanity check the cluster & droplets
	if _, _, err := ValidateDroplets(); err != nil {
		log.Info("todo: add flag to ignore. for now, fix problems in the config file.")
		return err
	}
	newe, err := ValidateDiskFilenames()
	if err != nil {
		log.Info(err)
		return err
	}
	// this is a new droplet. add it to the cluster
	for _, e := range newe {
		newEvents = append(newEvents, e)
	}
	ValidateUniqueFilenames()

	for _, filename := range argv.Xml {
		domcfg, err := virtigolib.ReadXml(filename)
		if err != nil {
			// parsing the libvirt xml file failed
			log.Info("error:", filename, err)
			log.Info("readXml() error", filename)
			log.Info("readXml() error", err)
			log.Info("libvirt XML will have to be fixed by hand")
			return err
		}
		// this is a new droplet. add it to the cluster
		log.Info("Add XML Droplet here", domcfg.Name)
		_, newe, err := virtigolib.AddDomainDroplet(me.cluster, domcfg)
		if err != nil {
			log.Info("addDomainDroplet() error", filename)
			log.Info("addDomainDroplet() error", err)
			log.Info("libvirt XML will have to be fixed by hand")
			return err
		}
		for _, e := range newe {
			newEvents = append(newEvents, e)
		}
	}
	for i, e := range newEvents {
		log.Info(i, "Event:", e.Droplet, e.FieldName, "orig:", e.OrigVal, "new:", e.NewVal)
		me.changed = true
	}

	if me.changed {
		if err := me.cluster.ConfigSave(); err != nil {
			log.Info("configsave error", err)
			return err
		}
		log.Info("XML changes saved in protobuf config")
		return nil
	}
	if len(argv.Xml) != 0 {
		log.Info("No XML changes found")
		return fmt.Errorf("No XML changes found")
	}

	// initialize each hypervisor
	for _, pbh := range me.cluster.H.Hypervisors {
		// this is a new unknown droplet (not in the config file)
		var h *HyperT
		h = new(HyperT)
		h.pb = pbh
		h.lastDroplets = make(map[string]time.Time)
		h.lastpoll = time.Now()

		me.hmap[pbh] = h
		me.hypers = append(me.hypers, h)
		log.Log(EVENT, "config new hypervisors", h.pb.Hostname)
	}

	// start the watchdog polling for each hypervisor
	for _, h := range me.hypers {
		log.Info("starting polling on", h.pb.Hostname)

		// start a watchdog on each hypervisor
		go h.NewWatchdog()
	}

	var cloud *virtigolib.CloudManager
	cloud = virtigolib.NewCloud()
	found, _ := cloud.FindDropletByName("www.wit.com")
	if found == nil {
		log.Info("d == nil")
	} else {
		log.Info("d == ", found)
	}

	startHTTP()
	return nil
}