diff --git a/manager/manager/expander.go b/manager/manager/expander.go index 0e3e33422..c906e6306 100644 --- a/manager/manager/expander.go +++ b/manager/manager/expander.go @@ -37,7 +37,7 @@ type ExpandedTemplate struct { // Expander abstracts interactions with the expander and deployer services. type Expander interface { - ExpandTemplate(t Template) (*ExpandedTemplate, error) + ExpandTemplate(t *Template) (*ExpandedTemplate, error) } // NewExpander returns a new initialized Expander. @@ -110,7 +110,9 @@ func walkLayout(l *Layout, toReplace map[string]*LayoutResource) map[string]*Lay } // ExpandTemplate expands the supplied template, and returns a configuration. -func (e *expander) ExpandTemplate(t Template) (*ExpandedTemplate, error) { +// It will also update the imports in the provided template if any were added +// during type resolution. +func (e *expander) ExpandTemplate(t *Template) (*ExpandedTemplate, error) { // We have a fencepost problem here. // 1. Start by trying to resolve any missing templates // 2. Expand the configuration using all the of the imports available to us at this point @@ -129,17 +131,17 @@ func (e *expander) ExpandTemplate(t Template) (*ExpandedTemplate, error) { newImp, err := e.typeResolver.ResolveTypes(config, t.Imports) if err != nil { e := fmt.Errorf("type resolution failed: %s", err) - return nil, expanderError(&t, e) + return nil, expanderError(t, e) } t.Imports = append(t.Imports, newImp...) for { // Now expand with everything imported. - result, err := e.expandTemplate(&t) + result, err := e.expandTemplate(t) if err != nil { e := fmt.Errorf("template expansion: %s", err) - return nil, expanderError(&t, e) + return nil, expanderError(t, e) } // Once we set this layout, we're operating on the "needResolve" *LayoutResources, @@ -151,10 +153,10 @@ func (e *expander) ExpandTemplate(t Template) (*ExpandedTemplate, error) { } needResolve = walkLayout(result.Layout, needResolve) - newImp, err = e.typeResolver.ResolveTypes(result.Config, nil) + newImp, err = e.typeResolver.ResolveTypes(result.Config, t.Imports) if err != nil { e := fmt.Errorf("type resolution failed: %s", err) - return nil, expanderError(&t, e) + return nil, expanderError(t, e) } // If the new imports contain nothing, we are done. Everything is fully expanded. @@ -163,16 +165,8 @@ func (e *expander) ExpandTemplate(t Template) (*ExpandedTemplate, error) { return result, nil } + // Update imports with any new imports from type resolution. t.Imports = append(t.Imports, newImp...) - var content []byte - content, err = yaml.Marshal(result.Config) - t.Content = string(content) - if err != nil { - e := fmt.Errorf("Unable to unmarshal response from expander (%s): %s", - err, result.Config) - return nil, expanderError(&t, e) - } - } } diff --git a/manager/manager/expander_test.go b/manager/manager/expander_test.go index 0bf80a179..11ba5ec58 100644 --- a/manager/manager/expander_test.go +++ b/manager/manager/expander_test.go @@ -262,7 +262,7 @@ func TestExpandTemplate(t *testing.T) { defer ts.Close() expander := NewExpander(ts.URL, etc.Resolver) - actualResponse, err := expander.ExpandTemplate(validTemplateTestCaseData) + actualResponse, err := expander.ExpandTemplate(&validTemplateTestCaseData) if err != nil { message := err.Error() if etc.Error == "" { diff --git a/manager/manager/manager.go b/manager/manager/manager.go index 6c218f0c8..170286871 100644 --- a/manager/manager/manager.go +++ b/manager/manager/manager.go @@ -142,7 +142,7 @@ func (m *manager) CreateDeployment(t *Template) (*Deployment, error) { } func (m *manager) createManifest(t *Template) (*Manifest, error) { - et, err := m.expander.ExpandTemplate(*t) + et, err := m.expander.ExpandTemplate(t) if err != nil { log.Printf("Expansion failed %v", err) return nil, err @@ -263,7 +263,7 @@ func (m *manager) PutDeployment(name string, t *Template) (*Deployment, error) { } func (m *manager) Expand(t *Template) (*Manifest, error) { - et, err := m.expander.ExpandTemplate(*t) + et, err := m.expander.ExpandTemplate(t) if err != nil { log.Printf("Expansion failed %v", err) return nil, err diff --git a/manager/manager/manager_test.go b/manager/manager/manager_test.go index 2b6eb7aa0..f31d56801 100644 --- a/manager/manager/manager_test.go +++ b/manager/manager/manager_test.go @@ -64,8 +64,8 @@ var errTest = errors.New("test") type expanderStub struct{} -func (expander *expanderStub) ExpandTemplate(t Template) (*ExpandedTemplate, error) { - if reflect.DeepEqual(t, template) { +func (expander *expanderStub) ExpandTemplate(t *Template) (*ExpandedTemplate, error) { + if reflect.DeepEqual(*t, template) { return &expandedConfig, nil } diff --git a/manager/manager/typeresolver.go b/manager/manager/typeresolver.go index 2696401a2..ab8dfd036 100644 --- a/manager/manager/typeresolver.go +++ b/manager/manager/typeresolver.go @@ -90,7 +90,11 @@ func (tr *typeResolver) ResolveTypes(config *Configuration, imports []*ImportFil // Only fetch HTTP URLs that we haven't already imported. if util.IsHttpUrl(r.Type) && !existing[r.Type] { toFetch = append(toFetch, r.Type) + fetched[r.Type] = append(fetched[r.Type], &ImportFile{Name: r.Type}) + + // Add to existing map so it is not fetched multiple times. + existing[r.Type] = true } }