in lib/adapter/aggregator_adapter.go [76:126]
func (a *AggregatorAdapter) CheckConfig(templateName string, template *pb.ServiceTemplate, resName, viewName string, view *pb.View, cfg *pb.DamConfig, adapters *ServiceAdapters) (string, error) {
if view == nil {
return "", nil
}
if len(view.Items) == 0 {
return httputils.StatusPath("resources", resName, "views", viewName, "items"), fmt.Errorf("view %q has no items defined", viewName)
}
adapterName := ""
adapterST := ""
for iIdx, item := range view.Items {
vars, path, err := GetItemVariables(adapters, template.ServiceName, item)
if err != nil {
return httputils.StatusPath("resources", resName, "views", viewName, "items", strconv.Itoa(iIdx), path), err
}
refResName := vars["resource"]
refRes, ok := cfg.Resources[refResName]
if !ok {
return httputils.StatusPath("resources", resName, "views", viewName, "items", strconv.Itoa(iIdx), "vars", "resource"), fmt.Errorf("resource %q not found", refResName)
}
refViewName := vars["view"]
refView, ok := refRes.Views[refViewName]
if !ok {
return httputils.StatusPath("resources", resName, "views", viewName, "items", strconv.Itoa(iIdx), "vars", "view"), fmt.Errorf("view %q not found", refViewName)
}
refSt, ok := cfg.ServiceTemplates[refView.ServiceTemplate]
if !ok {
return httputils.StatusPath("resources", refResName, "views", refViewName, "serviceTemplate"), fmt.Errorf("view service template %q not found", refView.ServiceTemplate)
}
adapt, ok := adapters.ByServiceName[refSt.ServiceName]
if !ok {
return httputils.StatusPath("resources", refResName, "views", refViewName, "serviceTemplate"), fmt.Errorf("view service name %q not defined", refSt.ServiceName)
}
if len(adapterName) == 0 {
adapterName = adapt.Name()
adapterST = refView.ServiceTemplate
} else if adapterName != adapt.Name() {
return httputils.StatusPath("resources", resName, "views", viewName, "items", strconv.Itoa(iIdx), "vars", "view"), fmt.Errorf("view service template %q service adapter %q does not match other items using service adapter %q", refView.ServiceTemplate, refSt.ServiceName, adapterName)
}
desc, ok := adapters.Descriptors[refSt.ServiceName]
if !ok || desc == nil || desc.Properties == nil {
return httputils.StatusPath("serviceTemplates", adapterST, "serviceName", refSt.ServiceName), fmt.Errorf("lookup of descriptor properties for %q on adapter %q failed: desc:\n%+v", refSt.ServiceName, adapterName, desc)
}
if !desc.Properties.CanBeAggregated {
return httputils.StatusPath("serviceTemplates", adapterST, "targetService", "properties", "canBeAggregated"), fmt.Errorf("aggregation on service adapter %q not supported", adapterName)
}
}
if adapterName == "" {
return httputils.StatusPath("resources", resName, "views", viewName, "items"), fmt.Errorf("included views offer no items to aggregate")
}
return "", nil
}