//Assembly into a carton. //a carton comprises of self contained boxes func mkCarton(aies string, ay string) (*Carton, error) { a, err := get(ay) if err != nil { return nil, err } b, err := a.mkBoxes(aies) if err != nil { return nil, err } c := &Carton{ Id: ay, //assembly id CartonsId: aies, //assemblies id Name: a.Name, Tosca: a.Tosca, ImageVersion: a.imageVersion(), DomainName: a.domain(), Compute: a.newCompute(), SSH: a.newSSH(), Provider: a.provider(), PublicIp: a.publicIp(), Boxes: &b, Status: provision.Status(a.Status), } return c, nil }
//lets make boxes with components to be mutated later or, and the required //information for a launch. //A "colored component" externalized with what we need. func (a *Assembly) mkBoxes(aies string) ([]provision.Box, error) { newBoxs := make([]provision.Box, 0, len(a.Components)) for _, comp := range a.Components { if len(strings.TrimSpace(comp.Id)) > 1 { if b, err := comp.mkBox(); err != nil { return nil, err } else { b.CartonId = a.Id b.CartonsId = aies b.CartonName = a.Name if len(strings.TrimSpace(b.Provider)) <= 0 { b.Provider = a.provider() } if len(strings.TrimSpace(b.PublicIp)) <= 0 { b.PublicIp = a.publicIp() } if b.Repo.IsEnabled() { b.Repo.Hook.CartonId = a.Id //this is screwy, why do we need it. b.Repo.Hook.BoxId = comp.Id } b.Compute = a.newCompute() b.SSH = a.newSSH() b.Status = provision.Status(a.Status) newBoxs = append(newBoxs, b) } } } return newBoxs, nil }