1package state
2
3import (
4	bias "github.com/cloudfoundry/bosh-agent/agentclient/applyspec"
5	"strconv"
6)
7
8type State interface {
9	NetworkInterfaces() []NetworkRef
10	RenderedJobs() []JobRef
11	CompiledPackages() []PackageRef
12	RenderedJobListArchive() BlobRef
13	ToApplySpec() bias.ApplySpec
14}
15
16// NetworkRef is a reference to a deployment network, with the interface the instance should use to connect to it.
17type NetworkRef struct {
18	Name string
19	// Interface would ideally be a struct with IP, Type & CloudProperties, but the agent supports arbitrary key/value pairs. :(
20	Interface map[string]interface{}
21}
22
23// JobRef is a reference to a rendered job.
24// Individual JobRefs do not have Archives because they are aggregated in RenderedJobListArchive.
25type JobRef struct {
26	Name    string
27	Version string
28}
29
30// PackageRef is a reference to a compiled package,
31type PackageRef struct {
32	Name    string
33	Version string
34	Archive BlobRef
35}
36
37// BlobRef is a reference to a file uploaded to the blobstore,
38type BlobRef struct {
39	BlobstoreID string
40	SHA1        string
41}
42
43type state struct {
44	deploymentName         string
45	name                   string
46	id                     int
47	networks               []NetworkRef
48	renderedJobs           []JobRef
49	compiledPackages       []PackageRef
50	renderedJobListArchive BlobRef
51}
52
53func NewState(
54	deploymentName string,
55	name string,
56	id int,
57	networks []NetworkRef,
58	renderedJobs []JobRef,
59	compiledPackages []PackageRef,
60	renderedJobListArchive BlobRef,
61	hash string,
62) State {
63	return &state{
64		deploymentName:         deploymentName,
65		name:                   name,
66		id:                     id,
67		networks:               networks,
68		renderedJobs:           renderedJobs,
69		compiledPackages:       compiledPackages,
70		renderedJobListArchive: renderedJobListArchive,
71	}
72}
73
74func (s *state) NetworkInterfaces() []NetworkRef { return s.networks }
75
76func (s *state) RenderedJobs() []JobRef { return s.renderedJobs }
77
78func (s *state) CompiledPackages() []PackageRef { return s.compiledPackages }
79
80func (s *state) RenderedJobListArchive() BlobRef { return s.renderedJobListArchive }
81
82func (s *state) ToApplySpec() bias.ApplySpec {
83	jobTemplateList := make([]bias.Blob, len(s.renderedJobs), len(s.renderedJobs))
84	for i, renderedJob := range s.renderedJobs {
85		jobTemplateList[i] = bias.Blob{
86			Name:    renderedJob.Name,
87			Version: renderedJob.Version,
88		}
89	}
90
91	packageMap := make(map[string]bias.Blob, len(s.compiledPackages))
92	for _, compiledPackage := range s.compiledPackages {
93		packageMap[compiledPackage.Name] = bias.Blob{
94			Name:        compiledPackage.Name,
95			Version:     compiledPackage.Version,
96			SHA1:        compiledPackage.Archive.SHA1,
97			BlobstoreID: compiledPackage.Archive.BlobstoreID,
98		}
99	}
100
101	networkMap := make(map[string]interface{}, len(s.networks))
102	for _, network := range s.networks {
103		networkMap[network.Name] = network.Interface
104	}
105
106	return bias.ApplySpec{
107		Deployment:       s.deploymentName,
108		NodeID:           strconv.Itoa(s.id),
109		AvailabilityZone: "unknown",
110		Name:             s.name,
111		Index:            s.id,
112		Networks:         networkMap,
113		Job: bias.Job{
114			Name:      s.name,
115			Templates: jobTemplateList,
116		},
117		Packages: packageMap,
118		RenderedTemplatesArchive: bias.RenderedTemplatesArchiveSpec{
119			BlobstoreID: s.renderedJobListArchive.BlobstoreID,
120			SHA1:        s.renderedJobListArchive.SHA1,
121		},
122		ConfigurationHash: "unused-configuration-hash",
123	}
124}
125