in images/controller/cmd/app_finder/app_finder.go [34:191]
func main() {
log.Printf("Starting broker app discovery service")
// Set from downward API.
namespace := os.Getenv("NAMESPACE")
if len(namespace) == 0 {
log.Fatal("Missing NAMESPACE env.")
}
// Allow for single run
singleIteration := false
if os.Getenv("SINGLE_ITERATION") == "true" {
singleIteration = true
}
// Map of cached app manifest checksums
bundleManifestChecksums := make(map[string]string, 0)
userBundleManifestChecksums := make(map[string]string, 0)
for {
// Fetch all user app configs
appConfigs, err := broker.FetchBrokerAppConfigs(namespace)
if err != nil {
log.Printf("failed to fetch broker app configs: %v", err)
}
// List of app specs that will be added to the registered app manifest.
registeredApps := broker.NewRegisteredAppManifest()
// Fetch all configmaps in single call
nsConfigMaps, err := broker.GetConfigMaps(namespace)
if err != nil {
log.Printf("failed to fetch broker appconfig map bundles: %v", err)
}
// Fetch data required for Egress Network Policy
networkPolicyData, err := broker.GetEgressNetworkPolicyData(namespace)
if err != nil {
log.Printf("failed to fetch networkpolicy data: %v", err)
}
registeredApps.NetworkPolicyData = networkPolicyData
// Base dir for temp directory where updated files are staged.
tmpDirBase := path.Dir(broker.BundleSourceBaseDir)
for _, appConfig := range appConfigs {
bundleCMName := appConfig.Spec.Bundle.ConfigMapRef.Name
authzCMName := appConfig.Spec.Authorization.ConfigMapRef.Name
appName := appConfig.Metadata.Name
bundleDestDir := path.Join(broker.BundleSourceBaseDir, appName)
userBundleDestDir := path.Join(broker.UserBundleSourceBaseDir, appName)
foundUserBundleCount := 0
// Find and save configmap data for required bundle and optional authz
foundBundle := false
foundAllUserBundles := false
foundAuthzCM := false
for _, cm := range nsConfigMaps {
// Match on bundle configmap name
if cm.Metadata.Name == bundleCMName {
// Update working mainfests if bundle has changed.
cacheKey := fmt.Sprintf("%s-%s", appName, cm.Metadata.Name)
if err := copyConfigMapDataIfChanged(cm, tmpDirBase, bundleDestDir, cacheKey, bundleManifestChecksums); err != nil {
log.Printf("%v", err)
} else {
foundBundle = true
}
}
// Match on a user bundle configmap name
for i, userBundle := range appConfig.Spec.UserBundles {
userBundleCMName := userBundle.ConfigMapRef.Name
// Match on user bundle configmap name
if cm.Metadata.Name == userBundleCMName {
destDir := path.Join(userBundleDestDir, fmt.Sprintf("%d", i))
cacheKey := fmt.Sprintf("%s-%s", appName, cm.Metadata.Name)
if err := copyConfigMapDataIfChanged(cm, tmpDirBase, destDir, cacheKey, userBundleManifestChecksums); err != nil {
log.Printf("%v", err)
} else {
foundUserBundleCount++
}
}
}
// Match on authz configmap name
if cm.Metadata.Name == authzCMName {
foundAuthzCM = true
// Extract authorization members and append them to the appConfig.Spec.AuthorizedUsers array.
for _, data := range cm.Data {
scanner := bufio.NewScanner(strings.NewReader(data))
for scanner.Scan() {
userPat := scanner.Text()
// Skip comment lines.
if !strings.HasPrefix(userPat, "#") {
_, err := regexp.Compile(userPat)
if err != nil {
log.Printf("WARN: invalid authorized user pattern found in ConfigMap %s: '%s', skipped.", authzCMName, userPat)
} else {
appConfig.Spec.AuthorizedUsers = append(appConfig.Spec.AuthorizedUsers, userPat)
}
}
}
}
}
}
if foundUserBundleCount == len(appConfig.Spec.UserBundles) {
foundAllUserBundles = true
}
if !foundBundle {
log.Printf("Bundle manifests ConfigMap %s not found for app %s", bundleCMName, appName)
} else if len(appConfig.Spec.UserBundles) > 0 && !foundAllUserBundles {
log.Printf("Failed to find all spec.userBundles for app %s", appName)
} else {
if len(authzCMName) > 0 && !foundAuthzCM {
log.Printf("Failed to find authorization ConfigMap bundle %s for app %s", authzCMName, appName)
}
// App is valid and bundle is ready, add to registered apps.
if !appConfig.Spec.Disabled {
registeredApps.Add(appConfig.Spec)
}
}
}
// Prune build source directories
foundDirs, err := filepath.Glob(path.Join(broker.BundleSourceBaseDir, "*"))
if err != nil {
log.Printf("failed to list app directories to prune: %v", err)
}
for _, dirName := range foundDirs {
found := false
for _, appConfig := range appConfigs {
if appConfig.Metadata.Name == path.Base(dirName) {
found = true
break
}
}
if !found {
log.Printf("removing build source: %s", dirName)
os.RemoveAll(dirName)
}
}
// Write registered app manifest
if err := registeredApps.WriteJSON(broker.RegisteredAppsManifestJSONFile); err != nil {
log.Printf("failed to write registered app manifest: %s: %v", broker.RegisteredAppsManifestJSONFile, err)
}
if singleIteration {
break
}
time.Sleep(5 * time.Second)
}
}