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