From 9b9ff2622d381e39f0cb78fe2c4bdd4f9bc9afae Mon Sep 17 00:00:00 2001 From: James Shubin Date: Tue, 11 Apr 2017 01:30:05 -0400 Subject: [PATCH] resources: Make resource kind and baseuid fields public This is required if we're going to have out of package resources. In particular for third party packages, and also for if we decide to split out each resource into a separate sub package. --- docs/resource-guide.md | 4 +-- etcd/etcd.go | 10 +++--- pgraph/actions.go | 70 ++++++++++++++++++------------------- pgraph/autoedge.go | 12 +++---- pgraph/autogroup.go | 2 +- pgraph/graphviz.go | 2 +- pgraph/pgraph.go | 2 +- resources/augeas.go | 14 ++++---- resources/exec.go | 12 +++---- resources/file.go | 22 ++++++------ resources/hostname.go | 4 +-- resources/kv.go | 10 +++--- resources/msg.go | 8 ++--- resources/noop.go | 6 ++-- resources/nspawn.go | 20 +++++------ resources/password.go | 12 +++---- resources/pkg.go | 24 ++++++------- resources/resources.go | 60 +++++++++++++++---------------- resources/resources_test.go | 6 ++-- resources/sendrecv.go | 18 +++++----- resources/svc.go | 20 +++++------ resources/timer.go | 8 ++--- resources/virt.go | 62 ++++++++++++++++---------------- yamlgraph/gconfig.go | 2 +- yamlgraph2/gconfig.go | 4 +-- 25 files changed, 207 insertions(+), 207 deletions(-) diff --git a/docs/resource-guide.md b/docs/resource-guide.md index 1d98e4e5..f6d6fc80 100644 --- a/docs/resource-guide.md +++ b/docs/resource-guide.md @@ -80,7 +80,7 @@ work, and finish by calling the `Init` method of the base resource. ```golang // Init initializes the Foo resource. func (obj *FooRes) Init() error { - obj.BaseRes.kind = "foo" // must lower case resource kind + obj.BaseRes.Kind = "foo" // must lower case resource kind // run the resource specific initialization, and error if anything fails if some_error { return err // something went wrong! @@ -516,7 +516,7 @@ This can _only_ be done inside of the `CheckApply` function! ```golang // inside CheckApply, probably near the top if val, exists := obj.Recv["SomeKey"]; exists { - log.Printf("SomeKey was sent to us from: %s[%s].%s", val.Res.Kind(), val.Res.GetName(), val.Key) + log.Printf("SomeKey was sent to us from: %s[%s].%s", val.Res.GetKind(), val.Res.GetName(), val.Key) if val.Changed { log.Printf("SomeKey was just updated!") // you may want to invalidate some local cache diff --git a/etcd/etcd.go b/etcd/etcd.go index e1df69c9..31d333be 100644 --- a/etcd/etcd.go +++ b/etcd/etcd.go @@ -2147,10 +2147,10 @@ func SetResources(obj *EmbdEtcd, hostname string, resourceList []resources.Res) ifs := []etcd.Cmp{} // list matching the desired state ops := []etcd.Op{} // list of ops in this transaction for _, res := range resourceList { - if res.Kind() == "" { + if res.GetKind() == "" { log.Fatalf("Etcd: SetResources: Error: Empty kind: %v", res.GetName()) } - uid := fmt.Sprintf("%s/%s", res.Kind(), res.GetName()) + uid := fmt.Sprintf("%s/%s", res.GetKind(), res.GetName()) path := fmt.Sprintf("/%s/exported/%s/resources/%s", NS, hostname, uid) if data, err := resources.ResToB64(res); err == nil { ifs = append(ifs, etcd.Compare(etcd.Value(path), "=", data)) // desired state @@ -2162,7 +2162,7 @@ func SetResources(obj *EmbdEtcd, hostname string, resourceList []resources.Res) match := func(res resources.Res, resourceList []resources.Res) bool { // helper lambda for _, x := range resourceList { - if res.Kind() == x.Kind() && res.GetName() == x.GetName() { + if res.GetKind() == x.GetKind() && res.GetName() == x.GetName() { return true } } @@ -2172,10 +2172,10 @@ func SetResources(obj *EmbdEtcd, hostname string, resourceList []resources.Res) hasDeletes := false // delete old, now unused resources here... for _, res := range originals { - if res.Kind() == "" { + if res.GetKind() == "" { log.Fatalf("Etcd: SetResources: Error: Empty kind: %v", res.GetName()) } - uid := fmt.Sprintf("%s/%s", res.Kind(), res.GetName()) + uid := fmt.Sprintf("%s/%s", res.GetKind(), res.GetName()) path := fmt.Sprintf("/%s/exported/%s/resources/%s", NS, hostname, uid) if match(res, resourceList) { // if we match, no need to delete! diff --git a/pgraph/actions.go b/pgraph/actions.go index 0ced5ba2..a5edb3df 100644 --- a/pgraph/actions.go +++ b/pgraph/actions.go @@ -55,7 +55,7 @@ func (g *Graph) OKTimestamp(v *Vertex) bool { // b/c we should let our pre-req's go first... x, y := v.GetTimestamp(), n.GetTimestamp() if g.Flags.Debug { - log.Printf("%s[%s]: OKTimestamp: (%v) >= %s[%s](%v): !%v", v.Kind(), v.GetName(), x, n.Kind(), n.GetName(), y, x >= y) + log.Printf("%s[%s]: OKTimestamp: (%v) >= %s[%s](%v): !%v", v.GetKind(), v.GetName(), x, n.GetKind(), n.GetName(), y, x >= y) } if x >= y { return false @@ -82,7 +82,7 @@ func (g *Graph) Poke(v *Vertex) error { // TODO: does this need an || activity flag? if n.Res.GetState() != resources.ResStateProcess { if g.Flags.Debug { - log.Printf("%s[%s]: Poke: %s[%s]", v.Kind(), v.GetName(), n.Kind(), n.GetName()) + log.Printf("%s[%s]: Poke: %s[%s]", v.GetKind(), v.GetName(), n.GetKind(), n.GetName()) } wg.Add(1) go func(nn *Vertex) error { @@ -94,7 +94,7 @@ func (g *Graph) Poke(v *Vertex) error { } else { if g.Flags.Debug { - log.Printf("%s[%s]: Poke: %s[%s]: Skipped!", v.Kind(), v.GetName(), n.Kind(), n.GetName()) + log.Printf("%s[%s]: Poke: %s[%s]: Skipped!", v.GetKind(), v.GetName(), n.GetKind(), n.GetName()) } } } @@ -117,7 +117,7 @@ func (g *Graph) BackPoke(v *Vertex) { // happens earlier in the state cycle and that doesn't wrap nil if x >= y && (s != resources.ResStateProcess && s != resources.ResStateCheckApply) { if g.Flags.Debug { - log.Printf("%s[%s]: BackPoke: %s[%s]", v.Kind(), v.GetName(), n.Kind(), n.GetName()) + log.Printf("%s[%s]: BackPoke: %s[%s]", v.GetKind(), v.GetName(), n.GetKind(), n.GetName()) } wg.Add(1) go func(nn *Vertex) error { @@ -127,7 +127,7 @@ func (g *Graph) BackPoke(v *Vertex) { } else { if g.Flags.Debug { - log.Printf("%s[%s]: BackPoke: %s[%s]: Skipped!", v.Kind(), v.GetName(), n.Kind(), n.GetName()) + log.Printf("%s[%s]: BackPoke: %s[%s]: Skipped!", v.GetKind(), v.GetName(), n.GetKind(), n.GetName()) } } } @@ -172,7 +172,7 @@ func (g *Graph) SetDownstreamRefresh(v *Vertex, b bool) { func (g *Graph) Process(v *Vertex) error { obj := v.Res if g.Flags.Debug { - log.Printf("%s[%s]: Process()", obj.Kind(), obj.GetName()) + log.Printf("%s[%s]: Process()", obj.GetKind(), obj.GetName()) } // FIXME: should these SetState methods be here or after the sema code? defer obj.SetState(resources.ResStateNil) // reset state when finished @@ -187,7 +187,7 @@ func (g *Graph) Process(v *Vertex) error { } // timestamp must be okay... if g.Flags.Debug { - log.Printf("%s[%s]: OKTimestamp(%v)", obj.Kind(), obj.GetName(), v.GetTimestamp()) + log.Printf("%s[%s]: OKTimestamp(%v)", obj.GetKind(), obj.GetName(), v.GetTimestamp()) } // semaphores! @@ -199,7 +199,7 @@ func (g *Graph) Process(v *Vertex) error { // TODO: Add a close mechanism to close/unblock zero count semaphores... semas := obj.Meta().Sema if g.Flags.Debug && len(semas) > 0 { - log.Printf("%s[%s]: Sema: P(%s)", obj.Kind(), obj.GetName(), strings.Join(semas, ", ")) + log.Printf("%s[%s]: Sema: P(%s)", obj.GetKind(), obj.GetName(), strings.Join(semas, ", ")) } if err := g.SemaLock(semas); err != nil { // lock // NOTE: in practice, this might not ever be truly necessary... @@ -207,7 +207,7 @@ func (g *Graph) Process(v *Vertex) error { } defer g.SemaUnlock(semas) // unlock if g.Flags.Debug && len(semas) > 0 { - defer log.Printf("%s[%s]: Sema: V(%s)", obj.Kind(), obj.GetName(), strings.Join(semas, ", ")) + defer log.Printf("%s[%s]: Sema: V(%s)", obj.GetKind(), obj.GetName(), strings.Join(semas, ", ")) } var ok = true @@ -231,7 +231,7 @@ func (g *Graph) Process(v *Vertex) error { var err error if g.Flags.Debug { - log.Printf("%s[%s]: CheckApply(%t)", obj.Kind(), obj.GetName(), !noop) + log.Printf("%s[%s]: CheckApply(%t)", obj.GetKind(), obj.GetName(), !noop) } // lookup the refresh (notification) variable @@ -256,9 +256,9 @@ func (g *Graph) Process(v *Vertex) error { // if this fails, don't UpdateTimestamp() checkOK, err = obj.CheckApply(!noop) - if promErr := obj.Prometheus().UpdateCheckApplyTotal(obj.Kind(), !noop, !checkOK, err != nil); promErr != nil { + if promErr := obj.Prometheus().UpdateCheckApplyTotal(obj.GetKind(), !noop, !checkOK, err != nil); promErr != nil { // TODO: how to error correctly - log.Printf("%s[%s]: Prometheus.UpdateCheckApplyTotal() errored: %v", v.Kind(), v.GetName(), err) + log.Printf("%s[%s]: Prometheus.UpdateCheckApplyTotal() errored: %v", v.GetKind(), v.GetName(), err) } // TODO: Can the `Poll` converged timeout tracking be a // more general method for all converged timeouts? this @@ -268,17 +268,17 @@ func (g *Graph) Process(v *Vertex) error { cuid, _, _ := v.Res.ConvergerUIDs() // get the converger uid used to report status cuid.ResetTimer() // activity! if g.Flags.Debug { - log.Printf("%s[%s]: Converger: ResetTimer", obj.Kind(), obj.GetName()) + log.Printf("%s[%s]: Converger: ResetTimer", obj.GetKind(), obj.GetName()) } } } } if checkOK && err != nil { // should never return this way - log.Fatalf("%s[%s]: CheckApply(): %t, %+v", obj.Kind(), obj.GetName(), checkOK, err) + log.Fatalf("%s[%s]: CheckApply(): %t, %+v", obj.GetKind(), obj.GetName(), checkOK, err) } if g.Flags.Debug { - log.Printf("%s[%s]: CheckApply(): %t, %v", obj.Kind(), obj.GetName(), checkOK, err) + log.Printf("%s[%s]: CheckApply(): %t, %v", obj.GetKind(), obj.GetName(), checkOK, err) } // if CheckApply ran without noop and without error, state should be good @@ -372,7 +372,7 @@ Loop: // if process started, but no action yet, skip! if v.Res.GetState() == resources.ResStateProcess { if g.Flags.Debug { - log.Printf("%s[%s]: Skipped event!", v.Kind(), v.GetName()) + log.Printf("%s[%s]: Skipped event!", v.GetKind(), v.GetName()) } ev.ACK() // ready for next message v.Res.QuiesceGroup().Done() @@ -383,7 +383,7 @@ Loop: // if waiting, we skip running a new execution! if running || waiting { if g.Flags.Debug { - log.Printf("%s[%s]: Playback added!", v.Kind(), v.GetName()) + log.Printf("%s[%s]: Playback added!", v.GetKind(), v.GetName()) } playback = true ev.ACK() // ready for next message @@ -393,7 +393,7 @@ Loop: // catch invalid rates if v.Meta().Burst == 0 && !(v.Meta().Limit == rate.Inf) { // blocked - e := fmt.Errorf("%s[%s]: Permanently limited (rate != Inf, burst: 0)", v.Kind(), v.GetName()) + e := fmt.Errorf("%s[%s]: Permanently limited (rate != Inf, burst: 0)", v.GetKind(), v.GetName()) ev.ACK() // ready for next message v.Res.QuiesceGroup().Done() v.SendEvent(event.EventExit, &SentinelErr{e}) @@ -411,7 +411,7 @@ Loop: if d > 0 { // delay limited = true playback = true - log.Printf("%s[%s]: Limited (rate: %v/sec, burst: %d, next: %v)", v.Kind(), v.GetName(), v.Meta().Limit, v.Meta().Burst, d) + log.Printf("%s[%s]: Limited (rate: %v/sec, burst: %d, next: %v)", v.GetKind(), v.GetName(), v.Meta().Limit, v.Meta().Burst, d) // start the timer... timer.Reset(d) waiting = true // waiting for retry timer @@ -429,11 +429,11 @@ Loop: defer wg.Done() if e := g.Process(v); e != nil { playback = true - log.Printf("%s[%s]: CheckApply errored: %v", v.Kind(), v.GetName(), e) + log.Printf("%s[%s]: CheckApply errored: %v", v.GetKind(), v.GetName(), e) if retry == 0 { - if err := obj.Prometheus().UpdateState(fmt.Sprintf("%s[%s]", v.Kind(), v.GetName()), v.Kind(), prometheus.ResStateHardFail); err != nil { + if err := obj.Prometheus().UpdateState(fmt.Sprintf("%s[%s]", v.GetKind(), v.GetName()), v.GetKind(), prometheus.ResStateHardFail); err != nil { // TODO: how to error this? - log.Printf("%s[%s]: Prometheus.UpdateState() errored: %v", v.Kind(), v.GetName(), err) + log.Printf("%s[%s]: Prometheus.UpdateState() errored: %v", v.GetKind(), v.GetName(), err) } // wrap the error in the sentinel @@ -444,11 +444,11 @@ Loop: if retry > 0 { // don't decrement the -1 retry-- } - if err := obj.Prometheus().UpdateState(fmt.Sprintf("%s[%s]", v.Kind(), v.GetName()), v.Kind(), prometheus.ResStateSoftFail); err != nil { + if err := obj.Prometheus().UpdateState(fmt.Sprintf("%s[%s]", v.GetKind(), v.GetName()), v.GetKind(), prometheus.ResStateSoftFail); err != nil { // TODO: how to error this? - log.Printf("%s[%s]: Prometheus.UpdateState() errored: %v", v.Kind(), v.GetName(), err) + log.Printf("%s[%s]: Prometheus.UpdateState() errored: %v", v.GetKind(), v.GetName(), err) } - log.Printf("%s[%s]: CheckApply: Retrying after %.4f seconds (%d left)", v.Kind(), v.GetName(), delay.Seconds(), retry) + log.Printf("%s[%s]: CheckApply: Retrying after %.4f seconds (%d left)", v.GetKind(), v.GetName(), delay.Seconds(), retry) // start the timer... timer.Reset(delay) waiting = true // waiting for retry timer @@ -469,7 +469,7 @@ Loop: if !timer.Stop() { //<-timer.C // blocks, docs are wrong! } - log.Printf("%s[%s]: CheckApply delay expired!", v.Kind(), v.GetName()) + log.Printf("%s[%s]: CheckApply delay expired!", v.GetKind(), v.GetName()) close(done) // a CheckApply run (with possibly retry pause) finished @@ -478,7 +478,7 @@ Loop: wcuid.SetConverged(false) } if g.Flags.Debug { - log.Printf("%s[%s]: CheckApply finished!", v.Kind(), v.GetName()) + log.Printf("%s[%s]: CheckApply finished!", v.GetKind(), v.GetName()) } done = make(chan struct{}) // reset // re-send this event, to trigger a CheckApply() @@ -521,8 +521,8 @@ func (g *Graph) Worker(v *Vertex) error { // running on, which isolates things nicely... obj := v.Res if g.Flags.Debug { - log.Printf("%s[%s]: Worker: Running", v.Kind(), v.GetName()) - defer log.Printf("%s[%s]: Worker: Stopped", v.Kind(), v.GetName()) + log.Printf("%s[%s]: Worker: Running", v.GetKind(), v.GetName()) + defer log.Printf("%s[%s]: Worker: Stopped", v.GetKind(), v.GetName()) } // run the init (should match 1-1 with Close function) if err := obj.Init(); err != nil { @@ -610,7 +610,7 @@ func (g *Graph) Worker(v *Vertex) error { } } timer.Stop() // it's nice to cleanup - log.Printf("%s[%s]: Watch delay expired!", v.Kind(), v.GetName()) + log.Printf("%s[%s]: Watch delay expired!", v.GetKind(), v.GetName()) // NOTE: we can avoid the send if running Watch guarantees // one CheckApply event on startup! //if pendingSendEvent { // TODO: should this become a list in the future? @@ -638,7 +638,7 @@ func (g *Graph) Worker(v *Vertex) error { err = sentinelErr.err break // sentinel means, perma-exit } - log.Printf("%s[%s]: Watch errored: %v", v.Kind(), v.GetName(), e) + log.Printf("%s[%s]: Watch errored: %v", v.GetKind(), v.GetName(), e) if watchRetry == 0 { err = fmt.Errorf("Permanent watch error: %v", e) break @@ -647,7 +647,7 @@ func (g *Graph) Worker(v *Vertex) error { watchRetry-- } watchDelay = time.Duration(v.Meta().Delay) * time.Millisecond - log.Printf("%s[%s]: Watch: Retrying after %.4f seconds (%d left)", v.Kind(), v.GetName(), watchDelay.Seconds(), watchRetry) + log.Printf("%s[%s]: Watch: Retrying after %.4f seconds (%d left)", v.GetKind(), v.GetName(), watchDelay.Seconds(), watchRetry) // We need to trigger a CheckApply after Watch restarts, so that // we catch any lost events that happened while down. We do this // by getting the Watch resource to send one event once it's up! @@ -721,12 +721,12 @@ func (g *Graph) Start(first bool) { // start or continue // TODO: if a sufficient number of workers error, // should something be done? Should these restart // after perma-failure if we have a graph change? - log.Printf("%s[%s]: Started", vv.Kind(), vv.GetName()) + log.Printf("%s[%s]: Started", vv.GetKind(), vv.GetName()) if err := g.Worker(vv); err != nil { // contains the Watch and CheckApply loops - log.Printf("%s[%s]: Exited with failure: %v", vv.Kind(), vv.GetName(), err) + log.Printf("%s[%s]: Exited with failure: %v", vv.GetKind(), vv.GetName(), err) return } - log.Printf("%s[%s]: Exited", vv.Kind(), vv.GetName()) + log.Printf("%s[%s]: Exited", vv.GetKind(), vv.GetName()) }(v) } diff --git a/pgraph/autoedge.go b/pgraph/autoedge.go index 6b32f450..24b6d165 100644 --- a/pgraph/autoedge.go +++ b/pgraph/autoedge.go @@ -39,7 +39,7 @@ func (g *Graph) addEdgesByMatchingUIDS(v *Vertex, uids []resources.ResUID) []boo continue } if g.Flags.Debug { - log.Printf("Compile: AutoEdge: Match: %s[%s] with UID: %s[%s]", vv.Kind(), vv.GetName(), uid.Kind(), uid.GetName()) + log.Printf("Compile: AutoEdge: Match: %s[%s] with UID: %s[%s]", vv.GetKind(), vv.GetName(), uid.GetKind(), uid.GetName()) } // we must match to an effective UID for the resource, // that is to say, the name value of a res is a helpful @@ -47,12 +47,12 @@ func (g *Graph) addEdgesByMatchingUIDS(v *Vertex, uids []resources.ResUID) []boo // remember, resources can return multiple UID's each! if resources.UIDExistsInUIDs(uid, vv.UIDs()) { // add edge from: vv -> v - if uid.Reversed() { - txt := fmt.Sprintf("AutoEdge: %s[%s] -> %s[%s]", vv.Kind(), vv.GetName(), v.Kind(), v.GetName()) + if uid.IsReversed() { + txt := fmt.Sprintf("AutoEdge: %s[%s] -> %s[%s]", vv.GetKind(), vv.GetName(), v.GetKind(), v.GetName()) log.Printf("Compile: Adding %s", txt) g.AddEdge(vv, v, NewEdge(txt)) } else { // edges go the "normal" way, eg: pkg resource - txt := fmt.Sprintf("AutoEdge: %s[%s] -> %s[%s]", v.Kind(), v.GetName(), vv.Kind(), vv.GetName()) + txt := fmt.Sprintf("AutoEdge: %s[%s] -> %s[%s]", v.GetKind(), v.GetName(), vv.GetKind(), vv.GetName()) log.Printf("Compile: Adding %s", txt) g.AddEdge(v, vv, NewEdge(txt)) } @@ -74,14 +74,14 @@ func (g *Graph) AutoEdges() { } autoEdgeObj := v.AutoEdges() if autoEdgeObj == nil { - log.Printf("%s[%s]: Config: No auto edges were found!", v.Kind(), v.GetName()) + log.Printf("%s[%s]: Config: No auto edges were found!", v.GetKind(), v.GetName()) continue // next vertex } for { // while the autoEdgeObj has more uids to add... uids := autoEdgeObj.Next() // get some! if uids == nil { - log.Printf("%s[%s]: Config: The auto edge list is empty!", v.Kind(), v.GetName()) + log.Printf("%s[%s]: Config: The auto edge list is empty!", v.GetKind(), v.GetName()) break // inner loop } if g.Flags.Debug { diff --git a/pgraph/autogroup.go b/pgraph/autogroup.go index caa07d58..aa4faaca 100644 --- a/pgraph/autogroup.go +++ b/pgraph/autogroup.go @@ -113,7 +113,7 @@ func (ag *baseGrouper) vertexCmp(v1, v2 *Vertex) error { if v1 == v2 { // skip yourself return fmt.Errorf("the vertices are the same") } - if v1.Kind() != v2.Kind() { // we must group similar kinds + if v1.GetKind() != v2.GetKind() { // we must group similar kinds // TODO: maybe future resources won't need this limitation? return fmt.Errorf("the two resources aren't the same kind") } diff --git a/pgraph/graphviz.go b/pgraph/graphviz.go index ae88b29a..9e6143c3 100644 --- a/pgraph/graphviz.go +++ b/pgraph/graphviz.go @@ -46,7 +46,7 @@ func (g *Graph) Graphviz() (out string) { //out += "\tnode [shape=box];\n" str := "" for i := range g.Adjacency { // reverse paths - out += fmt.Sprintf("\t\"%s\" [label=\"%s[%s]\"];\n", i.GetName(), i.Kind(), i.GetName()) + out += fmt.Sprintf("\t\"%s\" [label=\"%s[%s]\"];\n", i.GetName(), i.GetKind(), i.GetName()) for j := range g.Adjacency[i] { k := g.Adjacency[i][j] // use str for clearer output ordering diff --git a/pgraph/pgraph.go b/pgraph/pgraph.go index 945602ea..201a1f1c 100644 --- a/pgraph/pgraph.go +++ b/pgraph/pgraph.go @@ -297,7 +297,7 @@ func (g *Graph) String() string { // String returns the canonical form for a vertex func (v *Vertex) String() string { - return fmt.Sprintf("%s[%s]", v.Res.Kind(), v.Res.GetName()) + return fmt.Sprintf("%s[%s]", v.Res.GetKind(), v.Res.GetName()) } // IncomingGraphVertices returns an array (slice) of all directed vertices to diff --git a/resources/augeas.go b/resources/augeas.go index 42387975..72b3a88b 100644 --- a/resources/augeas.go +++ b/resources/augeas.go @@ -94,7 +94,7 @@ func (obj *AugeasRes) Validate() error { // Init initiates the resource. func (obj *AugeasRes) Init() error { - obj.BaseRes.kind = "augeas" + obj.BaseRes.Kind = "augeas" return obj.BaseRes.Init() // call base init, b/c we're overriding } @@ -119,7 +119,7 @@ func (obj *AugeasRes) Watch() error { for { if obj.debug { - log.Printf("%s[%s]: Watching: %s", obj.Kind(), obj.GetName(), obj.File) // attempting to watch... + log.Printf("%s[%s]: Watching: %s", obj.GetKind(), obj.GetName(), obj.File) // attempting to watch... } select { @@ -128,10 +128,10 @@ func (obj *AugeasRes) Watch() error { return nil } if err := event.Error; err != nil { - return errwrap.Wrapf(err, "Unknown %s[%s] watcher error", obj.Kind(), obj.GetName()) + return errwrap.Wrapf(err, "Unknown %s[%s] watcher error", obj.GetKind(), obj.GetName()) } if obj.debug { // don't access event.Body if event.Error isn't nil - log.Printf("%s[%s]: Event(%s): %v", obj.Kind(), obj.GetName(), event.Body.Name, event.Body.Op) + log.Printf("%s[%s]: Event(%s): %v", obj.GetKind(), obj.GetName(), event.Body.Name, event.Body.Op) } send = true obj.StateOK(false) // dirty @@ -178,7 +178,7 @@ func (obj *AugeasRes) checkApplySet(apply bool, ag *augeas.Augeas, set AugeasSet // CheckApply method for Augeas resource. func (obj *AugeasRes) CheckApply(apply bool) (bool, error) { - log.Printf("%s[%s]: CheckApply: %s", obj.Kind(), obj.GetName(), obj.File) + log.Printf("%s[%s]: CheckApply: %s", obj.GetKind(), obj.GetName(), obj.File) // By default we do not set any option to augeas, we use the defaults. opts := augeas.None if obj.Lens != "" { @@ -226,7 +226,7 @@ func (obj *AugeasRes) CheckApply(apply bool) (bool, error) { return checkOK, nil } - log.Printf("%s[%s]: changes needed, saving", obj.Kind(), obj.GetName()) + log.Printf("%s[%s]: changes needed, saving", obj.GetKind(), obj.GetName()) if err = ag.Save(); err != nil { return false, errwrap.Wrapf(err, "augeas: error while saving augeas values") } @@ -256,7 +256,7 @@ func (obj *AugeasRes) AutoEdges() AutoEdge { // UIDs includes all params to make a unique identification of this object. func (obj *AugeasRes) UIDs() []ResUID { x := &AugeasUID{ - BaseUID: BaseUID{name: obj.GetName(), kind: obj.Kind()}, + BaseUID: BaseUID{Name: obj.GetName(), Kind: obj.GetKind()}, name: obj.Name, } return []ResUID{x} diff --git a/resources/exec.go b/resources/exec.go index 29fd4350..c1c8c60f 100644 --- a/resources/exec.go +++ b/resources/exec.go @@ -69,7 +69,7 @@ func (obj *ExecRes) Validate() error { // Init runs some startup code for this resource. func (obj *ExecRes) Init() error { - obj.BaseRes.kind = "exec" + obj.BaseRes.Kind = "exec" return obj.BaseRes.Init() // call base init, b/c we're overriding } @@ -148,7 +148,7 @@ func (obj *ExecRes) Watch() error { select { case text := <-bufioch: // each time we get a line of output, we loop! - log.Printf("%s[%s]: Watch output: %s", obj.Kind(), obj.GetName(), text) + log.Printf("%s[%s]: Watch output: %s", obj.GetKind(), obj.GetName(), text) if text != "" { send = true obj.StateOK(false) // something made state dirty @@ -220,7 +220,7 @@ func (obj *ExecRes) CheckApply(apply bool) (bool, error) { } // apply portion - log.Printf("%s[%s]: Apply", obj.Kind(), obj.GetName()) + log.Printf("%s[%s]: Apply", obj.GetKind(), obj.GetName()) var cmdName string var cmdArgs []string if obj.Shell == "" { @@ -288,10 +288,10 @@ func (obj *ExecRes) CheckApply(apply bool) (bool, error) { // would be nice, but it would require terminal log output that doesn't // interleave all the parallel parts which would mix it all up... if s := out.String(); s == "" { - log.Printf("%s[%s]: Command output is empty!", obj.Kind(), obj.GetName()) + log.Printf("%s[%s]: Command output is empty!", obj.GetKind(), obj.GetName()) } else { - log.Printf("%s[%s]: Command output is:", obj.Kind(), obj.GetName()) + log.Printf("%s[%s]: Command output is:", obj.GetKind(), obj.GetName()) log.Printf(out.String()) } @@ -322,7 +322,7 @@ func (obj *ExecRes) AutoEdges() AutoEdge { // Most resources only return one, although some resources can return multiple. func (obj *ExecRes) UIDs() []ResUID { x := &ExecUID{ - BaseUID: BaseUID{name: obj.GetName(), kind: obj.Kind()}, + BaseUID: BaseUID{Name: obj.GetName(), Kind: obj.GetKind()}, Cmd: obj.Cmd, IfCmd: obj.IfCmd, // TODO: add more params here diff --git a/resources/file.go b/resources/file.go index 13725f45..fc91daed 100644 --- a/resources/file.go +++ b/resources/file.go @@ -148,7 +148,7 @@ func (obj *FileRes) Init() error { obj.path = obj.GetPath() // compute once obj.isDir = strings.HasSuffix(obj.path, "/") // dirs have trailing slashes - obj.BaseRes.kind = "file" + obj.BaseRes.Kind = "file" return obj.BaseRes.Init() // call base init, b/c we're overriding } @@ -199,7 +199,7 @@ func (obj *FileRes) Watch() error { for { if obj.debug { - log.Printf("%s[%s]: Watching: %s", obj.Kind(), obj.GetName(), obj.path) // attempting to watch... + log.Printf("%s[%s]: Watching: %s", obj.GetKind(), obj.GetName(), obj.path) // attempting to watch... } select { @@ -208,10 +208,10 @@ func (obj *FileRes) Watch() error { return nil } if err := event.Error; err != nil { - return errwrap.Wrapf(err, "unknown %s[%s] watcher error", obj.Kind(), obj.GetName()) + return errwrap.Wrapf(err, "unknown %s[%s] watcher error", obj.GetKind(), obj.GetName()) } if obj.debug { // don't access event.Body if event.Error isn't nil - log.Printf("%s[%s]: Event(%s): %v", obj.Kind(), obj.GetName(), event.Body.Name, event.Body.Op) + log.Printf("%s[%s]: Event(%s): %v", obj.GetKind(), obj.GetName(), event.Body.Name, event.Body.Op) } send = true obj.StateOK(false) // dirty @@ -636,7 +636,7 @@ func (obj *FileRes) syncCheckApply(apply bool, src, dst string) (bool, error) { // contentCheckApply performs a CheckApply for the file existence and content. func (obj *FileRes) contentCheckApply(apply bool) (checkOK bool, _ error) { - log.Printf("%s[%s]: contentCheckApply(%t)", obj.Kind(), obj.GetName(), apply) + log.Printf("%s[%s]: contentCheckApply(%t)", obj.GetKind(), obj.GetName(), apply) if obj.State == "absent" { if _, err := os.Stat(obj.path); os.IsNotExist(err) { @@ -698,7 +698,7 @@ func (obj *FileRes) contentCheckApply(apply bool) (checkOK bool, _ error) { // chmodCheckApply performs a CheckApply for the file permissions. func (obj *FileRes) chmodCheckApply(apply bool) (checkOK bool, _ error) { - log.Printf("%s[%s]: chmodCheckApply(%t)", obj.Kind(), obj.GetName(), apply) + log.Printf("%s[%s]: chmodCheckApply(%t)", obj.GetKind(), obj.GetName(), apply) if obj.State == "absent" { // File is absent @@ -744,7 +744,7 @@ func (obj *FileRes) chmodCheckApply(apply bool) (checkOK bool, _ error) { // chownCheckApply performs a CheckApply for the file ownership. func (obj *FileRes) chownCheckApply(apply bool) (checkOK bool, _ error) { var expectedUID, expectedGID int - log.Printf("%s[%s]: chownCheckApply(%t)", obj.Kind(), obj.GetName(), apply) + log.Printf("%s[%s]: chownCheckApply(%t)", obj.GetKind(), obj.GetName(), apply) if obj.State == "absent" { // File is absent or no owner specified @@ -906,9 +906,9 @@ func (obj *FileRes) AutoEdges() AutoEdge { var reversed = true // cheat by passing a pointer data = append(data, &FileUID{ BaseUID: BaseUID{ - name: obj.GetName(), - kind: obj.Kind(), - reversed: &reversed, + Name: obj.GetName(), + Kind: obj.GetKind(), + Reversed: &reversed, }, path: x, // what matters }) // build list @@ -924,7 +924,7 @@ func (obj *FileRes) AutoEdges() AutoEdge { // Most resources only return one, although some resources can return multiple. func (obj *FileRes) UIDs() []ResUID { x := &FileUID{ - BaseUID: BaseUID{name: obj.GetName(), kind: obj.Kind()}, + BaseUID: BaseUID{Name: obj.GetName(), Kind: obj.GetKind()}, path: obj.path, } return []ResUID{x} diff --git a/resources/hostname.go b/resources/hostname.go index 8872f92e..1d295937 100644 --- a/resources/hostname.go +++ b/resources/hostname.go @@ -88,7 +88,7 @@ func (obj *HostnameRes) Validate() error { // Init runs some startup code for this resource. func (obj *HostnameRes) Init() error { - obj.BaseRes.kind = "hostname" + obj.BaseRes.Kind = "hostname" if obj.PrettyHostname == "" { obj.PrettyHostname = obj.Hostname } @@ -237,7 +237,7 @@ func (obj *HostnameRes) AutoEdges() AutoEdge { // Most resources only return one, although some resources can return multiple. func (obj *HostnameRes) UIDs() []ResUID { x := &HostnameUID{ - BaseUID: BaseUID{name: obj.GetName(), kind: obj.Kind()}, + BaseUID: BaseUID{Name: obj.GetName(), Kind: obj.GetKind()}, name: obj.Name, prettyHostname: obj.PrettyHostname, staticHostname: obj.StaticHostname, diff --git a/resources/kv.go b/resources/kv.go index c61723fd..6683fa31 100644 --- a/resources/kv.go +++ b/resources/kv.go @@ -89,7 +89,7 @@ func (obj *KVRes) Validate() error { // Init initializes the resource. func (obj *KVRes) Init() error { - obj.BaseRes.kind = "kv" + obj.BaseRes.Kind = "kv" return obj.BaseRes.Init() // call base init, b/c we're overriding } @@ -113,10 +113,10 @@ func (obj *KVRes) Watch() error { return nil } if err != nil { - return errwrap.Wrapf(err, "unknown %s[%s] watcher error", obj.Kind(), obj.GetName()) + return errwrap.Wrapf(err, "unknown %s[%s] watcher error", obj.GetKind(), obj.GetName()) } if obj.Data().Debug { - log.Printf("%s[%s]: Event!", obj.Kind(), obj.GetName()) + log.Printf("%s[%s]: Event!", obj.GetKind(), obj.GetName()) } send = true obj.StateOK(false) // dirty @@ -177,7 +177,7 @@ func (obj *KVRes) lessThanCheck(value string) (checkOK bool, err error) { // CheckApply method for Password resource. Does nothing, returns happy! func (obj *KVRes) CheckApply(apply bool) (checkOK bool, err error) { - log.Printf("%s[%s]: CheckApply(%t)", obj.Kind(), obj.GetName(), apply) + log.Printf("%s[%s]: CheckApply(%t)", obj.GetKind(), obj.GetName(), apply) if val, exists := obj.Recv["Value"]; exists && val.Changed { // if we received on Value, and it changed, wooo, nothing to do. @@ -235,7 +235,7 @@ func (obj *KVRes) AutoEdges() AutoEdge { // Most resources only return one, although some resources can return multiple. func (obj *KVRes) UIDs() []ResUID { x := &KVUID{ - BaseUID: BaseUID{name: obj.GetName(), kind: obj.Kind()}, + BaseUID: BaseUID{Name: obj.GetName(), Kind: obj.GetKind()}, name: obj.Name, } return []ResUID{x} diff --git a/resources/msg.go b/resources/msg.go index e76faaac..204eecc9 100644 --- a/resources/msg.go +++ b/resources/msg.go @@ -76,7 +76,7 @@ func (obj *MsgRes) Validate() error { // Init runs some startup code for this resource. func (obj *MsgRes) Init() error { - obj.BaseRes.kind = "msg" + obj.BaseRes.Kind = "msg" return obj.BaseRes.Init() // call base init, b/c we're overrriding } @@ -168,7 +168,7 @@ func (obj *MsgRes) CheckApply(apply bool) (bool, error) { } if !obj.logStateOK { - log.Printf("%s[%s]: Body: %s", obj.Kind(), obj.GetName(), obj.Body) + log.Printf("%s[%s]: Body: %s", obj.GetKind(), obj.GetName(), obj.Body) obj.logStateOK = true obj.updateStateOK() } @@ -196,8 +196,8 @@ func (obj *MsgRes) CheckApply(apply bool) (bool, error) { func (obj *MsgRes) UIDs() []ResUID { x := &MsgUID{ BaseUID: BaseUID{ - name: obj.GetName(), - kind: obj.Kind(), + Name: obj.GetName(), + Kind: obj.GetKind(), }, body: obj.Body, } diff --git a/resources/noop.go b/resources/noop.go index 8268afc3..0568cf3f 100644 --- a/resources/noop.go +++ b/resources/noop.go @@ -50,7 +50,7 @@ func (obj *NoopRes) Validate() error { // Init runs some startup code for this resource. func (obj *NoopRes) Init() error { - obj.BaseRes.kind = "noop" + obj.BaseRes.Kind = "noop" return obj.BaseRes.Init() // call base init, b/c we're overriding } @@ -83,7 +83,7 @@ func (obj *NoopRes) Watch() error { // CheckApply method for Noop resource. Does nothing, returns happy! func (obj *NoopRes) CheckApply(apply bool) (checkOK bool, err error) { if obj.Refresh() { - log.Printf("%s[%s]: Received a notification!", obj.Kind(), obj.GetName()) + log.Printf("%s[%s]: Received a notification!", obj.GetKind(), obj.GetName()) } return true, nil // state is always okay } @@ -103,7 +103,7 @@ func (obj *NoopRes) AutoEdges() AutoEdge { // Most resources only return one, although some resources can return multiple. func (obj *NoopRes) UIDs() []ResUID { x := &NoopUID{ - BaseUID: BaseUID{name: obj.GetName(), kind: obj.Kind()}, + BaseUID: BaseUID{Name: obj.GetName(), Kind: obj.GetKind()}, name: obj.Name, } return []ResUID{x} diff --git a/resources/nspawn.go b/resources/nspawn.go index 735ae70b..ce77f1b2 100644 --- a/resources/nspawn.go +++ b/resources/nspawn.go @@ -93,7 +93,7 @@ func (obj *NspawnRes) Init() error { if err := obj.svc.Init(); err != nil { return err } - obj.BaseRes.kind = "nspawn" + obj.BaseRes.Kind = "nspawn" return obj.BaseRes.Init() } @@ -134,11 +134,11 @@ func (obj *NspawnRes) Watch() error { case event := <-buschan: // process org.freedesktop.machine1 events for this resource's name if event.Body[0] == obj.GetName() { - log.Printf("%s[%s]: Event received: %v", obj.Kind(), obj.GetName(), event.Name) + log.Printf("%s[%s]: Event received: %v", obj.GetKind(), obj.GetName(), event.Name) if event.Name == machineNew { - log.Printf("%s[%s]: Machine started", obj.Kind(), obj.GetName()) + log.Printf("%s[%s]: Machine started", obj.GetKind(), obj.GetName()) } else if event.Name == machineRemoved { - log.Printf("%s[%s]: Machine stopped", obj.Kind(), obj.GetName()) + log.Printf("%s[%s]: Machine stopped", obj.GetKind(), obj.GetName()) } else { return fmt.Errorf("unknown event: %s", event.Name) } @@ -195,13 +195,13 @@ func (obj *NspawnRes) CheckApply(apply bool) (checkOK bool, err error) { } } if obj.debug { - log.Printf("%s[%s]: properties: %v", obj.Kind(), obj.GetName(), properties) + log.Printf("%s[%s]: properties: %v", obj.GetKind(), obj.GetName(), properties) } // if the machine doesn't exist and is supposed to // be stopped or the state matches we're done if !exists && obj.State == stopped || properties["State"] == obj.State { if obj.debug { - log.Printf("%s[%s]: CheckApply() in valid state", obj.Kind(), obj.GetName()) + log.Printf("%s[%s]: CheckApply() in valid state", obj.GetKind(), obj.GetName()) } return true, nil } @@ -212,12 +212,12 @@ func (obj *NspawnRes) CheckApply(apply bool) (checkOK bool, err error) { } if obj.debug { - log.Printf("%s[%s]: CheckApply() applying '%s' state", obj.Kind(), obj.GetName(), obj.State) + log.Printf("%s[%s]: CheckApply() applying '%s' state", obj.GetKind(), obj.GetName(), obj.State) } if obj.State == running { // start the machine using svc resource - log.Printf("%s[%s]: Starting machine", obj.Kind(), obj.GetName()) + log.Printf("%s[%s]: Starting machine", obj.GetKind(), obj.GetName()) // assume state had to be changed at this point, ignore checkOK if _, err := obj.svc.CheckApply(apply); err != nil { return false, errwrap.Wrapf(err, "nested svc failed") @@ -226,7 +226,7 @@ func (obj *NspawnRes) CheckApply(apply bool) (checkOK bool, err error) { if obj.State == stopped { // terminate the machine with // org.freedesktop.machine1.Manager.KillMachine - log.Printf("%s[%s]: Stopping machine", obj.Kind(), obj.GetName()) + log.Printf("%s[%s]: Stopping machine", obj.GetKind(), obj.GetName()) if err := conn.TerminateMachine(obj.GetName()); err != nil { return false, errwrap.Wrapf(err, "failed to stop machine") } @@ -258,7 +258,7 @@ func (obj *NspawnUID) IFF(uid ResUID) bool { // most resources only return one although some resources can return multiple func (obj *NspawnRes) UIDs() []ResUID { x := &NspawnUID{ - BaseUID: BaseUID{name: obj.GetName(), kind: obj.Kind()}, + BaseUID: BaseUID{Name: obj.GetName(), Kind: obj.GetKind()}, name: obj.Name, // svc name } return append([]ResUID{x}, obj.svc.UIDs()...) diff --git a/resources/password.go b/resources/password.go index 69d3641b..6d7c9e20 100644 --- a/resources/password.go +++ b/resources/password.go @@ -74,7 +74,7 @@ func (obj *PasswordRes) Validate() error { // Init generates a new password for this resource if one was not provided. It // will save this into a local file. It will load it back in from previous runs. func (obj *PasswordRes) Init() error { - obj.BaseRes.kind = "password" // must be set before using VarDir + obj.BaseRes.Kind = "password" // must be set before using VarDir dir, err := obj.VarDir("") if err != nil { @@ -188,7 +188,7 @@ func (obj *PasswordRes) Watch() error { return nil } if err := event.Error; err != nil { - return errwrap.Wrapf(err, "unknown %s[%s] watcher error", obj.Kind(), obj.GetName()) + return errwrap.Wrapf(err, "unknown %s[%s] watcher error", obj.GetKind(), obj.GetName()) } send = true obj.StateOK(false) // dirty @@ -229,7 +229,7 @@ func (obj *PasswordRes) CheckApply(apply bool) (checkOK bool, err error) { if !obj.CheckRecovery { return false, errwrap.Wrapf(err, "check failed") } - log.Printf("%s[%s]: Integrity check failed", obj.Kind(), obj.GetName()) + log.Printf("%s[%s]: Integrity check failed", obj.GetKind(), obj.GetName()) generate = true // okay to build a new one write = true // make sure to write over the old one } @@ -263,7 +263,7 @@ func (obj *PasswordRes) CheckApply(apply bool) (checkOK bool, err error) { } // generate the actual password var err error - log.Printf("%s[%s]: Generating new password...", obj.Kind(), obj.GetName()) + log.Printf("%s[%s]: Generating new password...", obj.GetKind(), obj.GetName()) if password, err = obj.generate(); err != nil { // generate one! return false, errwrap.Wrapf(err, "could not generate password") } @@ -280,7 +280,7 @@ func (obj *PasswordRes) CheckApply(apply bool) (checkOK bool, err error) { output = password } // write either an empty token, or the password - log.Printf("%s[%s]: Writing password token...", obj.Kind(), obj.GetName()) + log.Printf("%s[%s]: Writing password token...", obj.GetKind(), obj.GetName()) if _, err := obj.write(output); err != nil { return false, errwrap.Wrapf(err, "can't write to file") } @@ -304,7 +304,7 @@ func (obj *PasswordRes) AutoEdges() AutoEdge { // Most resources only return one, although some resources can return multiple. func (obj *PasswordRes) UIDs() []ResUID { x := &PasswordUID{ - BaseUID: BaseUID{name: obj.GetName(), kind: obj.Kind()}, + BaseUID: BaseUID{Name: obj.GetName(), Kind: obj.GetKind()}, name: obj.Name, } return []ResUID{x} diff --git a/resources/pkg.go b/resources/pkg.go index 2cc4f115..ca2d74ab 100644 --- a/resources/pkg.go +++ b/resources/pkg.go @@ -67,7 +67,7 @@ func (obj *PkgRes) Validate() error { // Init runs some startup code for this resource. func (obj *PkgRes) Init() error { - obj.BaseRes.kind = "pkg" + obj.BaseRes.Kind = "pkg" if err := obj.BaseRes.Init(); err != nil { // call base init, b/c we're overriding return err } @@ -179,9 +179,9 @@ func (obj *PkgRes) getNames() []string { // pretty print for header values func (obj *PkgRes) fmtNames(names []string) string { if len(obj.GetGroup()) > 0 { // grouped elements - return fmt.Sprintf("%s[autogroup:(%v)]", obj.Kind(), strings.Join(names, ",")) + return fmt.Sprintf("%s[autogroup:(%v)]", obj.GetKind(), strings.Join(names, ",")) } - return fmt.Sprintf("%s[%s]", obj.Kind(), obj.GetName()) + return fmt.Sprintf("%s[%s]", obj.GetKind(), obj.GetName()) } func (obj *PkgRes) groupMappingHelper() map[string]string { @@ -190,7 +190,7 @@ func (obj *PkgRes) groupMappingHelper() map[string]string { for _, x := range g { pkg, ok := x.(*PkgRes) // convert from Res if !ok { - log.Fatalf("grouped member %v is not a %s", x, obj.Kind()) + log.Fatalf("grouped member %v is not a %s", x, obj.GetKind()) } result[pkg.Name] = pkg.State } @@ -356,9 +356,9 @@ func (obj *PkgResAutoEdges) Next() []ResUID { var reversed = false // cheat by passing a pointer result = append(result, &FileUID{ BaseUID: BaseUID{ - name: obj.name, - kind: obj.kind, - reversed: &reversed, + Name: obj.name, + Kind: obj.kind, + Reversed: &reversed, }, path: x, // what matters }) // build list @@ -430,9 +430,9 @@ func (obj *PkgRes) AutoEdges() AutoEdge { var reversed = false svcUIDs = append(svcUIDs, &SvcUID{ BaseUID: BaseUID{ - name: obj.GetName(), - kind: obj.Kind(), - reversed: &reversed, + Name: obj.GetName(), + Kind: obj.GetKind(), + Reversed: &reversed, }, name: x, // the svc name itself in the SvcUID object! }) // build list @@ -443,7 +443,7 @@ func (obj *PkgRes) AutoEdges() AutoEdge { svcUIDs: svcUIDs, testIsNext: false, // start with Next() call name: obj.GetName(), // save data for PkgResAutoEdges obj - kind: obj.Kind(), + kind: obj.GetKind(), } } @@ -451,7 +451,7 @@ func (obj *PkgRes) AutoEdges() AutoEdge { // Most resources only return one, although some resources can return multiple. func (obj *PkgRes) UIDs() []ResUID { x := &PkgUID{ - BaseUID: BaseUID{name: obj.GetName(), kind: obj.Kind()}, + BaseUID: BaseUID{Name: obj.GetName(), Kind: obj.GetKind()}, name: obj.Name, state: obj.State, } diff --git a/resources/resources.go b/resources/resources.go index 7965f4ca..1e3fa43b 100644 --- a/resources/resources.go +++ b/resources/resources.go @@ -101,18 +101,18 @@ type Data struct { // ResUID is a unique identifier for a resource, namely it's name, and the kind ("type"). type ResUID interface { GetName() string - Kind() string + GetKind() string IFF(ResUID) bool - Reversed() bool // true means this resource happens before the generator + IsReversed() bool // true means this resource happens before the generator } // The BaseUID struct is used to provide a unique resource identifier. type BaseUID struct { - name string // name and kind are the values of where this is coming from - kind string + Name string // name and kind are the values of where this is coming from + Kind string - reversed *bool // piggyback edge information here + Reversed *bool // piggyback edge information here } // The AutoEdge interface is used to implement the autoedges feature. @@ -170,7 +170,7 @@ type Base interface { GetName() string // can't be named "Name()" because of struct field SetName(string) SetKind(string) - Kind() string + GetKind() string Meta() *MetaParams Events() chan *event.Event Data() *Data @@ -232,7 +232,7 @@ type BaseRes struct { MetaParams MetaParams `yaml:"meta"` // struct of all the metaparams Recv map[string]*Send // mapping of key to receive on from value - kind string + Kind string data Data state ResState prefix string // base prefix for this resource @@ -305,12 +305,12 @@ func UIDExistsInUIDs(uid ResUID, uids []ResUID) bool { // GetName returns the name of the resource. func (obj *BaseUID) GetName() string { - return obj.name + return obj.Name } -// Kind returns the kind of resource. -func (obj *BaseUID) Kind() string { - return obj.kind +// GetKind returns the kind of the resource. +func (obj *BaseUID) GetKind() string { + return obj.Kind } // IFF looks at two UID's and if and only if they are equivalent, returns true. @@ -322,16 +322,16 @@ func (obj *BaseUID) IFF(uid ResUID) bool { if !ok { return false } - return obj.name == res.name + return obj.Name == res.Name } -// Reversed is part of the ResUID interface, and true means this resource +// IsReversed is part of the ResUID interface, and true means this resource // happens before the generator. -func (obj *BaseUID) Reversed() bool { - if obj.reversed == nil { +func (obj *BaseUID) IsReversed() bool { + if obj.Reversed == nil { log.Fatal("Programming error!") } - return *obj.reversed + return *obj.Reversed } // Validate reports any problems with the struct definition. @@ -346,9 +346,9 @@ func (obj *BaseRes) Validate() error { // Init initializes structures like channels if created without New constructor. func (obj *BaseRes) Init() error { if obj.debug { - log.Printf("%s[%s]: Init()", obj.Kind(), obj.GetName()) + log.Printf("%s[%s]: Init()", obj.GetKind(), obj.GetName()) } - if obj.kind == "" { + if obj.Kind == "" { return fmt.Errorf("resource did not set kind") } @@ -383,7 +383,7 @@ func (obj *BaseRes) Init() error { // TODO: this StatefulBool implementation could be eventually swappable //obj.refreshState = &DiskBool{Path: path.Join(dir, refreshPathToken)} - if err := obj.Prometheus().AddManagedResource(fmt.Sprintf("%s[%s]", obj.Kind(), obj.GetName()), obj.Kind()); err != nil { + if err := obj.Prometheus().AddManagedResource(fmt.Sprintf("%s[%s]", obj.GetKind(), obj.GetName()), obj.GetKind()); err != nil { return errwrap.Wrapf(err, "could not increase prometheus counter!") } @@ -393,7 +393,7 @@ func (obj *BaseRes) Init() error { // Close shuts down and performs any cleanup. func (obj *BaseRes) Close() error { if obj.debug { - log.Printf("%s[%s]: Close()", obj.Kind(), obj.GetName()) + log.Printf("%s[%s]: Close()", obj.GetKind(), obj.GetName()) } obj.pcuid.Unregister() @@ -404,7 +404,7 @@ func (obj *BaseRes) Close() error { close(obj.stopped) obj.waitGroup.Done() - if err := obj.Prometheus().RemoveManagedResource(fmt.Sprintf("%s[%s]", obj.Kind(), obj.GetName()), obj.kind); err != nil { + if err := obj.Prometheus().RemoveManagedResource(fmt.Sprintf("%s[%s]", obj.GetKind(), obj.GetName()), obj.GetKind()); err != nil { return errwrap.Wrapf(err, "could not decrease prometheus counter!") } @@ -423,12 +423,12 @@ func (obj *BaseRes) SetName(name string) { // SetKind sets the kind. This is used internally for exported resources. func (obj *BaseRes) SetKind(kind string) { - obj.kind = kind + obj.Kind = kind } -// Kind returns the kind of resource this is. -func (obj *BaseRes) Kind() string { - return obj.kind +// GetKind returns the kind of resource this is. +func (obj *BaseRes) GetKind() string { + return obj.Kind } // Meta returns the MetaParams as a reference, which we can then get/set on. @@ -502,7 +502,7 @@ func (obj *BaseRes) GetState() ResState { // SetState sets the state of the resource. func (obj *BaseRes) SetState(state ResState) { if obj.debug { - log.Printf("%s[%s]: State: %v -> %v", obj.Kind(), obj.GetName(), obj.GetState(), state) + log.Printf("%s[%s]: State: %v -> %v", obj.GetKind(), obj.GetName(), obj.GetState(), state) } obj.state = state } @@ -644,7 +644,7 @@ func (obj *BaseRes) VarDir(extra string) (string, error) { if obj.prefix == "" { return "", fmt.Errorf("the VarDir prefix is empty") } - if obj.Kind() == "" { + if obj.GetKind() == "" { return "", fmt.Errorf("the VarDir kind is empty") } if obj.GetName() == "" { @@ -653,9 +653,9 @@ func (obj *BaseRes) VarDir(extra string) (string, error) { // FIXME: is obj.GetName() sufficiently unique to use as a UID here? uid := obj.GetName() - p := fmt.Sprintf("%s/", path.Join(obj.prefix, obj.Kind(), uid, extra)) + p := fmt.Sprintf("%s/", path.Join(obj.prefix, obj.GetKind(), uid, extra)) if err := os.MkdirAll(p, 0770); err != nil { - return "", errwrap.Wrapf(err, "can't create prefix for %s[%s]", obj.Kind(), obj.GetName()) + return "", errwrap.Wrapf(err, "can't create prefix for %s[%s]", obj.GetKind(), obj.GetName()) } return p, nil } @@ -689,7 +689,7 @@ func (obj *BaseRes) Poll() error { for { select { case <-ticker.C: // received the timer event - log.Printf("%s[%s]: polling...", obj.Kind(), obj.GetName()) + log.Printf("%s[%s]: polling...", obj.GetKind(), obj.GetName()) send = true obj.StateOK(false) // dirty diff --git a/resources/resources_test.go b/resources/resources_test.go index d7b311ca..7911e2df 100644 --- a/resources/resources_test.go +++ b/resources/resources_test.go @@ -106,9 +106,9 @@ func TestMiscEncodeDecode2(t *testing.T) { } func TestIFF(t *testing.T) { - uid := &BaseUID{name: "/tmp/unit-test"} - same := &BaseUID{name: "/tmp/unit-test"} - diff := &BaseUID{name: "/tmp/other-file"} + uid := &BaseUID{Name: "/tmp/unit-test"} + same := &BaseUID{Name: "/tmp/unit-test"} + diff := &BaseUID{Name: "/tmp/other-file"} if !uid.IFF(same) { t.Error("basic resource UIDs with the same name should satisfy each other's IFF condition.") diff --git a/resources/sendrecv.go b/resources/sendrecv.go index f482213c..cde89cec 100644 --- a/resources/sendrecv.go +++ b/resources/sendrecv.go @@ -46,9 +46,9 @@ func (obj *BaseRes) Event() error { func (obj *BaseRes) SendEvent(ev event.Kind, err error) error { if obj.debug { if err == nil { - log.Printf("%s[%s]: SendEvent(%+v)", obj.Kind(), obj.GetName(), ev) + log.Printf("%s[%s]: SendEvent(%+v)", obj.GetKind(), obj.GetName(), ev) } else { - log.Printf("%s[%s]: SendEvent(%+v): %v", obj.Kind(), obj.GetName(), ev, err) + log.Printf("%s[%s]: SendEvent(%+v): %v", obj.GetKind(), obj.GetName(), ev, err) } } resp := event.NewResp() @@ -129,7 +129,7 @@ func (obj *BaseRes) ReadEvent(ev *event.Event) (exit *error, send bool) { continue // silently discard this event while paused } // if we get a poke event here, it's a bug! - err = fmt.Errorf("%s[%s]: unknown event: %v, while paused", obj.Kind(), obj.GetName(), e) + err = fmt.Errorf("%s[%s]: unknown event: %v, while paused", obj.GetKind(), obj.GetName(), e) panic(err) // TODO: return a special sentinel instead? //return &err, false } @@ -179,7 +179,7 @@ type Send struct { func (obj *BaseRes) SendRecv(res Res) (map[string]bool, error) { if obj.debug { // NOTE: this could expose private resource data like passwords - log.Printf("%s[%s]: SendRecv: %+v", obj.Kind(), obj.GetName(), obj.Recv) + log.Printf("%s[%s]: SendRecv: %+v", obj.GetKind(), obj.GetName(), obj.Recv) } var updated = make(map[string]bool) // list of updated keys var err error @@ -205,7 +205,7 @@ func (obj *BaseRes) SendRecv(res Res) (map[string]bool, error) { // i think we probably want the same kind, at least for now... if kind1 != kind2 { - e := fmt.Errorf("kind mismatch between %s[%s]: %s and %s[%s]: %s", v.Res.Kind(), v.Res.GetName(), kind1, obj.Kind(), obj.GetName(), kind2) + e := fmt.Errorf("kind mismatch between %s[%s]: %s and %s[%s]: %s", v.Res.GetKind(), v.Res.GetName(), kind1, obj.GetKind(), obj.GetName(), kind2) err = multierr.Append(err, e) // list of errors continue } @@ -213,21 +213,21 @@ func (obj *BaseRes) SendRecv(res Res) (map[string]bool, error) { // if the types don't match, we can't use send->recv // TODO: do we want to relax this for string -> *string ? if e := TypeCmp(value1, value2); e != nil { - e := errwrap.Wrapf(e, "type mismatch between %s[%s] and %s[%s]", v.Res.Kind(), v.Res.GetName(), obj.Kind(), obj.GetName()) + e := errwrap.Wrapf(e, "type mismatch between %s[%s] and %s[%s]", v.Res.GetKind(), v.Res.GetName(), obj.GetKind(), obj.GetName()) err = multierr.Append(err, e) // list of errors continue } // if we can't set, then well this is pointless! if !value2.CanSet() { - e := fmt.Errorf("can't set %s[%s].%s", obj.Kind(), obj.GetName(), k) + e := fmt.Errorf("can't set %s[%s].%s", obj.GetKind(), obj.GetName(), k) err = multierr.Append(err, e) // list of errors continue } // if we can't interface, we can't compare... if !value1.CanInterface() || !value2.CanInterface() { - e := fmt.Errorf("can't interface %s[%s].%s", obj.Kind(), obj.GetName(), k) + e := fmt.Errorf("can't interface %s[%s].%s", obj.GetKind(), obj.GetName(), k) err = multierr.Append(err, e) // list of errors continue } @@ -238,7 +238,7 @@ func (obj *BaseRes) SendRecv(res Res) (map[string]bool, error) { value2.Set(value1) // do it for all types that match updated[k] = true // we updated this key! v.Changed = true // tag this key as updated! - log.Printf("SendRecv: %s[%s].%s -> %s[%s].%s", v.Res.Kind(), v.Res.GetName(), v.Key, obj.Kind(), obj.GetName(), k) + log.Printf("SendRecv: %s[%s].%s -> %s[%s].%s", v.Res.GetKind(), v.Res.GetName(), v.Key, obj.GetKind(), obj.GetName(), k) } } return updated, err diff --git a/resources/svc.go b/resources/svc.go index 7a71c6a0..c9641f8c 100644 --- a/resources/svc.go +++ b/resources/svc.go @@ -67,7 +67,7 @@ func (obj *SvcRes) Validate() error { // Init runs some startup code for this resource. func (obj *SvcRes) Init() error { - obj.BaseRes.kind = "svc" + obj.BaseRes.Kind = "svc" return obj.BaseRes.Init() // call base init, b/c we're overriding } @@ -196,7 +196,7 @@ func (obj *SvcRes) Watch() error { obj.StateOK(false) // dirty case err := <-subErrors: - return errwrap.Wrapf(err, "unknown %s[%s] error", obj.Kind(), obj.GetName()) + return errwrap.Wrapf(err, "unknown %s[%s] error", obj.GetKind(), obj.GetName()) case event := <-obj.Events(): if exit, send = obj.ReadEvent(event); exit != nil { @@ -267,7 +267,7 @@ func (obj *SvcRes) CheckApply(apply bool) (checkOK bool, err error) { } // apply portion - log.Printf("%s[%s]: Apply", obj.Kind(), obj.GetName()) + log.Printf("%s[%s]: Apply", obj.GetKind(), obj.GetName()) var files = []string{svc} // the svc represented in a list if obj.Startup == "enabled" { _, _, err = conn.EnableUnitFiles(files, false, true) @@ -289,7 +289,7 @@ func (obj *SvcRes) CheckApply(apply bool) (checkOK bool, err error) { return false, errwrap.Wrapf(err, "failed to start unit") } if refresh { - log.Printf("%s[%s]: Skipping reload, due to pending start", obj.Kind(), obj.GetName()) + log.Printf("%s[%s]: Skipping reload, due to pending start", obj.GetKind(), obj.GetName()) } refresh = false // we did a start, so a reload is not needed } else if obj.State == "stopped" { @@ -298,7 +298,7 @@ func (obj *SvcRes) CheckApply(apply bool) (checkOK bool, err error) { return false, errwrap.Wrapf(err, "failed to stop unit") } if refresh { - log.Printf("%s[%s]: Skipping reload, due to pending stop", obj.Kind(), obj.GetName()) + log.Printf("%s[%s]: Skipping reload, due to pending stop", obj.GetKind(), obj.GetName()) } refresh = false // we did a stop, so a reload is not needed } @@ -313,7 +313,7 @@ func (obj *SvcRes) CheckApply(apply bool) (checkOK bool, err error) { if refresh { // we need to reload the service // XXX: run a svc reload here! - log.Printf("%s[%s]: Reloading...", obj.Kind(), obj.GetName()) + log.Printf("%s[%s]: Reloading...", obj.GetKind(), obj.GetName()) } // XXX: also set enabled on boot @@ -390,9 +390,9 @@ func (obj *SvcRes) AutoEdges() AutoEdge { var reversed = true data = append(data, &FileUID{ BaseUID: BaseUID{ - name: obj.GetName(), - kind: obj.Kind(), - reversed: &reversed, + Name: obj.GetName(), + Kind: obj.GetKind(), + Reversed: &reversed, }, path: x, // what matters }) @@ -408,7 +408,7 @@ func (obj *SvcRes) AutoEdges() AutoEdge { // Most resources only return one, although some resources can return multiple. func (obj *SvcRes) UIDs() []ResUID { x := &SvcUID{ - BaseUID: BaseUID{name: obj.GetName(), kind: obj.Kind()}, + BaseUID: BaseUID{Name: obj.GetName(), Kind: obj.GetKind()}, name: obj.Name, // svc name } return []ResUID{x} diff --git a/resources/timer.go b/resources/timer.go index a0875b57..cc470fed 100644 --- a/resources/timer.go +++ b/resources/timer.go @@ -59,7 +59,7 @@ func (obj *TimerRes) Validate() error { // Init runs some startup code for this resource. func (obj *TimerRes) Init() error { - obj.BaseRes.kind = "timer" + obj.BaseRes.Kind = "timer" return obj.BaseRes.Init() // call base init, b/c we're overrriding } @@ -85,7 +85,7 @@ func (obj *TimerRes) Watch() error { select { case <-obj.ticker.C: // received the timer event send = true - log.Printf("%s[%s]: received tick", obj.Kind(), obj.GetName()) + log.Printf("%s[%s]: received tick", obj.GetKind(), obj.GetName()) case event := <-obj.Events(): if exit, _ := obj.ReadEvent(event); exit != nil { @@ -121,8 +121,8 @@ func (obj *TimerRes) CheckApply(apply bool) (bool, error) { func (obj *TimerRes) UIDs() []ResUID { x := &TimerUID{ BaseUID: BaseUID{ - name: obj.GetName(), - kind: obj.Kind(), + Name: obj.GetName(), + Kind: obj.GetKind(), }, name: obj.Name, } diff --git a/resources/virt.go b/resources/virt.go index 1b2bd1a1..600b752f 100644 --- a/resources/virt.go +++ b/resources/virt.go @@ -137,7 +137,7 @@ func (obj *VirtRes) Init() error { var u *url.URL var err error if u, err = url.Parse(obj.URI); err != nil { - return errwrap.Wrapf(err, "%s[%s]: Parsing URI failed: %s", obj.Kind(), obj.GetName(), obj.URI) + return errwrap.Wrapf(err, "%s[%s]: Parsing URI failed: %s", obj.GetKind(), obj.GetName(), obj.URI) } switch u.Scheme { case "lxc": @@ -148,7 +148,7 @@ func (obj *VirtRes) Init() error { obj.conn, err = obj.connect() // gets closed in Close method of Res API if err != nil { - return errwrap.Wrapf(err, "%s[%s]: Connection to libvirt failed in init", obj.Kind(), obj.GetName()) + return errwrap.Wrapf(err, "%s[%s]: Connection to libvirt failed in init", obj.GetKind(), obj.GetName()) } // check for hard to change properties @@ -156,14 +156,14 @@ func (obj *VirtRes) Init() error { if err == nil { defer dom.Free() } else if !isNotFound(err) { - return errwrap.Wrapf(err, "%s[%s]: Could not lookup on init", obj.Kind(), obj.GetName()) + return errwrap.Wrapf(err, "%s[%s]: Could not lookup on init", obj.GetKind(), obj.GetName()) } if err == nil { // maxCPUs, err := dom.GetMaxVcpus() i, err := dom.GetVcpusFlags(libvirt.DOMAIN_VCPU_MAXIMUM) if err != nil { - return errwrap.Wrapf(err, "%s[%s]: Could not lookup MaxCPUs on init", obj.Kind(), obj.GetName()) + return errwrap.Wrapf(err, "%s[%s]: Could not lookup MaxCPUs on init", obj.GetKind(), obj.GetName()) } maxCPUs := uint(i) if obj.MaxCPUs != maxCPUs { // max cpu slots is hard to change @@ -176,11 +176,11 @@ func (obj *VirtRes) Init() error { // event handlers so that we don't miss any events via race? xmlDesc, err := dom.GetXMLDesc(0) // 0 means no flags if err != nil { - return errwrap.Wrapf(err, "%s[%s]: Could not GetXMLDesc on init", obj.Kind(), obj.GetName()) + return errwrap.Wrapf(err, "%s[%s]: Could not GetXMLDesc on init", obj.GetKind(), obj.GetName()) } domXML := &libvirtxml.Domain{} if err := domXML.Unmarshal(xmlDesc); err != nil { - return errwrap.Wrapf(err, "%s[%s]: Could not unmarshal XML on init", obj.Kind(), obj.GetName()) + return errwrap.Wrapf(err, "%s[%s]: Could not unmarshal XML on init", obj.GetKind(), obj.GetName()) } // guest agent: domain->devices->channel->target->state == connected? @@ -192,7 +192,7 @@ func (obj *VirtRes) Init() error { } } obj.wg = &sync.WaitGroup{} - obj.BaseRes.kind = "virt" + obj.BaseRes.Kind = "virt" return obj.BaseRes.Init() // call base init, b/c we're overriding } @@ -400,22 +400,22 @@ func (obj *VirtRes) Watch() error { obj.guestAgentConnected = true obj.StateOK(false) // dirty send = true - log.Printf("%s[%s]: Guest agent connected", obj.Kind(), obj.GetName()) + log.Printf("%s[%s]: Guest agent connected", obj.GetKind(), obj.GetName()) } else if state == libvirt.CONNECT_DOMAIN_EVENT_AGENT_LIFECYCLE_STATE_DISCONNECTED { obj.guestAgentConnected = false // ignore CONNECT_DOMAIN_EVENT_AGENT_LIFECYCLE_REASON_DOMAIN_STARTED // events because they just tell you that guest agent channel was added if reason == libvirt.CONNECT_DOMAIN_EVENT_AGENT_LIFECYCLE_REASON_CHANNEL { - log.Printf("%s[%s]: Guest agent disconnected", obj.Kind(), obj.GetName()) + log.Printf("%s[%s]: Guest agent disconnected", obj.GetKind(), obj.GetName()) } } else { - return fmt.Errorf("unknown %s[%s] guest agent state: %v", obj.Kind(), obj.GetName(), state) + return fmt.Errorf("unknown %s[%s] guest agent state: %v", obj.GetKind(), obj.GetName(), state) } case err := <-errorChan: - return fmt.Errorf("unknown %s[%s] libvirt error: %s", obj.Kind(), obj.GetName(), err) + return fmt.Errorf("unknown %s[%s] libvirt error: %s", obj.GetKind(), obj.GetName(), err) case event := <-obj.Events(): if exit, send = obj.ReadEvent(event); exit != nil { @@ -453,7 +453,7 @@ func (obj *VirtRes) domainCreate() (*libvirt.Domain, bool, error) { if err != nil { return dom, false, err // returned dom is invalid } - log.Printf("%s[%s]: Domain transient %s", state, obj.Kind(), obj.GetName()) + log.Printf("%s[%s]: Domain transient %s", state, obj.GetKind(), obj.GetName()) return dom, false, nil } @@ -461,20 +461,20 @@ func (obj *VirtRes) domainCreate() (*libvirt.Domain, bool, error) { if err != nil { return dom, false, err // returned dom is invalid } - log.Printf("%s[%s]: Domain defined", obj.Kind(), obj.GetName()) + log.Printf("%s[%s]: Domain defined", obj.GetKind(), obj.GetName()) if obj.State == "running" { if err := dom.Create(); err != nil { return dom, false, err } - log.Printf("%s[%s]: Domain started", obj.Kind(), obj.GetName()) + log.Printf("%s[%s]: Domain started", obj.GetKind(), obj.GetName()) } if obj.State == "paused" { if err := dom.CreateWithFlags(libvirt.DOMAIN_START_PAUSED); err != nil { return dom, false, err } - log.Printf("%s[%s]: Domain created paused", obj.Kind(), obj.GetName()) + log.Printf("%s[%s]: Domain created paused", obj.GetKind(), obj.GetName()) } return dom, false, nil @@ -512,14 +512,14 @@ func (obj *VirtRes) stateCheckApply(apply bool, dom *libvirt.Domain) (bool, erro return false, errwrap.Wrapf(err, "domain.Resume failed") } checkOK = false - log.Printf("%s[%s]: Domain resumed", obj.Kind(), obj.GetName()) + log.Printf("%s[%s]: Domain resumed", obj.GetKind(), obj.GetName()) break } if err := dom.Create(); err != nil { return false, errwrap.Wrapf(err, "domain.Create failed") } checkOK = false - log.Printf("%s[%s]: Domain created", obj.Kind(), obj.GetName()) + log.Printf("%s[%s]: Domain created", obj.GetKind(), obj.GetName()) case "paused": if domInfo.State == libvirt.DOMAIN_PAUSED { @@ -533,14 +533,14 @@ func (obj *VirtRes) stateCheckApply(apply bool, dom *libvirt.Domain) (bool, erro return false, errwrap.Wrapf(err, "domain.Suspend failed") } checkOK = false - log.Printf("%s[%s]: Domain paused", obj.Kind(), obj.GetName()) + log.Printf("%s[%s]: Domain paused", obj.GetKind(), obj.GetName()) break } if err := dom.CreateWithFlags(libvirt.DOMAIN_START_PAUSED); err != nil { return false, errwrap.Wrapf(err, "domain.CreateWithFlags failed") } checkOK = false - log.Printf("%s[%s]: Domain created paused", obj.Kind(), obj.GetName()) + log.Printf("%s[%s]: Domain created paused", obj.GetKind(), obj.GetName()) case "shutoff": if domInfo.State == libvirt.DOMAIN_SHUTOFF || domInfo.State == libvirt.DOMAIN_SHUTDOWN { @@ -554,7 +554,7 @@ func (obj *VirtRes) stateCheckApply(apply bool, dom *libvirt.Domain) (bool, erro return false, errwrap.Wrapf(err, "domain.Destroy failed") } checkOK = false - log.Printf("%s[%s]: Domain destroyed", obj.Kind(), obj.GetName()) + log.Printf("%s[%s]: Domain destroyed", obj.GetKind(), obj.GetName()) } return checkOK, nil @@ -580,7 +580,7 @@ func (obj *VirtRes) attrCheckApply(apply bool, dom *libvirt.Domain) (bool, error if err := dom.SetMemory(obj.Memory); err != nil { return false, errwrap.Wrapf(err, "domain.SetMemory failed") } - log.Printf("%s[%s]: Memory changed to %d", obj.Kind(), obj.GetName(), obj.Memory) + log.Printf("%s[%s]: Memory changed to %d", obj.GetKind(), obj.GetName(), obj.Memory) } // check cpus @@ -619,7 +619,7 @@ func (obj *VirtRes) attrCheckApply(apply bool, dom *libvirt.Domain) (bool, error return false, errwrap.Wrapf(err, "domain.SetVcpus failed") } checkOK = false - log.Printf("%s[%s]: CPUs (hot) changed to %d", obj.Kind(), obj.GetName(), obj.CPUs) + log.Printf("%s[%s]: CPUs (hot) changed to %d", obj.GetKind(), obj.GetName(), obj.CPUs) case libvirt.DOMAIN_SHUTOFF, libvirt.DOMAIN_SHUTDOWN: if !obj.Transient { @@ -631,7 +631,7 @@ func (obj *VirtRes) attrCheckApply(apply bool, dom *libvirt.Domain) (bool, error return false, errwrap.Wrapf(err, "domain.SetVcpus failed") } checkOK = false - log.Printf("%s[%s]: CPUs (cold) changed to %d", obj.Kind(), obj.GetName(), obj.CPUs) + log.Printf("%s[%s]: CPUs (cold) changed to %d", obj.GetKind(), obj.GetName(), obj.CPUs) } default: @@ -662,7 +662,7 @@ func (obj *VirtRes) attrCheckApply(apply bool, dom *libvirt.Domain) (bool, error return false, errwrap.Wrapf(err, "domain.SetVcpus failed") } checkOK = false - log.Printf("%s[%s]: CPUs (guest) changed to %d", obj.Kind(), obj.GetName(), obj.CPUs) + log.Printf("%s[%s]: CPUs (guest) changed to %d", obj.GetKind(), obj.GetName(), obj.CPUs) } } @@ -686,7 +686,7 @@ func (obj *VirtRes) domainShutdownSync(apply bool, dom *libvirt.Domain) (bool, e return false, errwrap.Wrapf(err, "domain.GetInfo failed") } if domInfo.State == libvirt.DOMAIN_SHUTOFF || domInfo.State == libvirt.DOMAIN_SHUTDOWN { - log.Printf("%s[%s]: Shutdown", obj.Kind(), obj.GetName()) + log.Printf("%s[%s]: Shutdown", obj.GetKind(), obj.GetName()) break } @@ -698,7 +698,7 @@ func (obj *VirtRes) domainShutdownSync(apply bool, dom *libvirt.Domain) (bool, e obj.processExitChan = make(chan struct{}) // if machine shuts down before we call this, we error; // this isn't ideal, but it happened due to user error! - log.Printf("%s[%s]: Running shutdown", obj.Kind(), obj.GetName()) + log.Printf("%s[%s]: Running shutdown", obj.GetKind(), obj.GetName()) if err := dom.Shutdown(); err != nil { // FIXME: if machine is already shutdown completely, return early return false, errwrap.Wrapf(err, "domain.Shutdown failed") @@ -719,7 +719,7 @@ func (obj *VirtRes) domainShutdownSync(apply bool, dom *libvirt.Domain) (bool, e // https://libvirt.org/formatdomain.html#elementsEvents continue case <-timeout: - return false, fmt.Errorf("%s[%s]: didn't shutdown after %d seconds", obj.Kind(), obj.GetName(), MaxShutdownDelayTimeout) + return false, fmt.Errorf("%s[%s]: didn't shutdown after %d seconds", obj.GetKind(), obj.GetName(), MaxShutdownDelayTimeout) } } @@ -791,7 +791,7 @@ func (obj *VirtRes) CheckApply(apply bool) (bool, error) { if err := dom.Undefine(); err != nil { return false, errwrap.Wrapf(err, "domain.Undefine failed") } - log.Printf("%s[%s]: Domain undefined", obj.Kind(), obj.GetName()) + log.Printf("%s[%s]: Domain undefined", obj.GetKind(), obj.GetName()) } else { domXML, err := dom.GetXMLDesc(libvirt.DOMAIN_XML_INACTIVE) if err != nil { @@ -800,7 +800,7 @@ func (obj *VirtRes) CheckApply(apply bool) (bool, error) { if _, err = obj.conn.DomainDefineXML(domXML); err != nil { return false, errwrap.Wrapf(err, "conn.DomainDefineXML failed") } - log.Printf("%s[%s]: Domain defined", obj.Kind(), obj.GetName()) + log.Printf("%s[%s]: Domain defined", obj.GetKind(), obj.GetName()) } checkOK = false } @@ -848,7 +848,7 @@ func (obj *VirtRes) CheckApply(apply bool) (bool, error) { // we had to do a restart, we didn't, and we should error if it was needed if obj.restartScheduled && restart == true && obj.RestartOnDiverge == "error" { - return false, fmt.Errorf("%s[%s]: needed restart but didn't! (RestartOnDiverge: %v)", obj.Kind(), obj.GetName(), obj.RestartOnDiverge) + return false, fmt.Errorf("%s[%s]: needed restart but didn't! (RestartOnDiverge: %v)", obj.GetKind(), obj.GetName(), obj.RestartOnDiverge) } return checkOK, nil // w00t @@ -1055,7 +1055,7 @@ type VirtUID struct { // Most resources only return one, although some resources can return multiple. func (obj *VirtRes) UIDs() []ResUID { x := &VirtUID{ - BaseUID: BaseUID{name: obj.GetName(), kind: obj.Kind()}, + BaseUID: BaseUID{Name: obj.GetName(), Kind: obj.GetKind()}, // TODO: add more properties here so we can link to vm dependencies } return []ResUID{x} diff --git a/yamlgraph/gconfig.go b/yamlgraph/gconfig.go index 13b183e5..5311e4f1 100644 --- a/yamlgraph/gconfig.go +++ b/yamlgraph/gconfig.go @@ -177,7 +177,7 @@ func (c *GraphConfig) NewGraphFromConfig(hostname string, world resources.World, log.Printf("Collect: %v; Pattern: %v", kind, t.Pattern) // XXX: expand to more complex pattern matching here... - if res.Kind() != kind { + if res.GetKind() != kind { continue } diff --git a/yamlgraph2/gconfig.go b/yamlgraph2/gconfig.go index eed08376..73e6f179 100644 --- a/yamlgraph2/gconfig.go +++ b/yamlgraph2/gconfig.go @@ -170,7 +170,7 @@ func (c *GraphConfig) NewGraphFromConfig(hostname string, world resources.World, // Resources for _, res := range c.ResList { - kind := res.Kind() + kind := res.GetKind() if _, exists := lookup[kind]; !exists { lookup[kind] = make(map[string]*pgraph.Vertex) } @@ -223,7 +223,7 @@ func (c *GraphConfig) NewGraphFromConfig(hostname string, world resources.World, log.Printf("Collect: %v; Pattern: %v", kind, t.Pattern) // XXX: expand to more complex pattern matching here... - if res.Kind() != kind { + if res.GetKind() != kind { continue }