func main()

in cmd/config_merger/main.go [68:135]


func main() {
	log := logrus.WithField("component", componentName)
	opt := gatherOptions()
	opt.validate(log)

	var file []byte

	if opt.listPath != "" {
		var err error
		file, err = ioutil.ReadFile(opt.listPath)
		if err != nil {
			log.WithField("--config-list", opt.listPath).WithError(err).Fatalf("Can't find --config-list")
		}
	}

	if opt.listURL != "" {
		resp, err := http.Get(opt.listURL)
		if err != nil {
			log.WithField("--config-url", opt.listURL).WithError(err).Fatalf("Can't GET --config-url")
		}
		defer resp.Body.Close()
		file, err = ioutil.ReadAll(resp.Body)
		if err != nil {
			log.WithField("--config-url", opt.listURL).WithError(err).Fatalf("Can't read contents at --config-url")
		}
	}

	list, err := merger.ParseAndCheck(file)
	if err != nil {
		log.WithError(err).Fatal("Can't parse YAML merge config")
	}

	log.WithField("merge-list", list).Debug("YAML mergelist read successful")

	ctx, cancel := context.WithCancel(context.Background())
	defer cancel()
	storageClient, err := gcs.ClientWithCreds(ctx, opt.creds)
	if err != nil {
		log.WithError(err).Fatalf("Can't make storage client")
	}

	client := gcs.NewClient(storageClient)

	mets := merger.CreateMetrics(prometheus.NewFactory())

	updateOnce := func(ctx context.Context) {
		ctx, cancel := context.WithTimeout(ctx, 10*time.Minute)
		defer cancel()
		log.Info("Starting MergeAndUpdate")
		_, err := merger.MergeAndUpdate(ctx, client, mets, list, opt.skipValidate, opt.confirm)
		if err != nil {
			log.WithError(err).Error("Update failed")
			return
		}
	}

	updateOnce(ctx)
	if opt.wait == 0 {
		return
	}
	timer := time.NewTimer(opt.wait)
	defer timer.Stop()
	for range timer.C {
		timer.Reset(opt.wait)
		updateOnce(ctx)
		log.WithField("--wait", opt.wait).Info("Sleeping")
	}
}