func main() { kingpin.Version(version.VERSION) cmd, opts := flags.ParseWithConsulOptions() logger := logging.NewLogger(logrus.Fields{}) logger.Logger.Formatter = &logrus.TextFormatter{} if *logLevel != "" { lv, err := logrus.ParseLevel(*logLevel) if err != nil { logger.WithErrorAndFields(err, logrus.Fields{"level": *logLevel}).Fatalln("Could not parse log level") } logger.Logger.Level = lv } client := kp.NewConsulClient(opts) labeler := labels.NewConsulApplicator(client, 3) sched := rc.NewApplicatorScheduler(labeler) if *labelEndpoint != "" { endpoint, err := url.Parse(*labelEndpoint) if err != nil { logging.DefaultLogger.WithErrorAndFields(err, logrus.Fields{ "url": *labelEndpoint, }).Fatalln("Could not parse URL from label endpoint") } httpLabeler, err := labels.NewHttpApplicator(opts.Client, endpoint) if err != nil { logging.DefaultLogger.WithError(err).Fatalln("Could not create label applicator from endpoint") } sched = rc.NewApplicatorScheduler(httpLabeler) } rctl := RCtl{ baseClient: client, rcs: rcstore.NewConsul(client, 3), rls: rollstore.NewConsul(client), kps: kp.NewConsulStore(client), labeler: labeler, sched: sched, hcheck: checker.NewConsulHealthChecker(client), logger: logger, } switch cmd { case CMD_CREATE: rctl.Create(*createManifest, *createNodeSel, *createPodLabels) case CMD_DELETE: rctl.Delete(*deleteID, *deleteForce) case CMD_REPLICAS: rctl.SetReplicas(*replicasID, *replicasNum) case CMD_LIST: rctl.List(*listJSON) case CMD_GET: rctl.Get(*getID, *getManifest) case CMD_ENABLE: rctl.Enable(*enableID) case CMD_DISABLE: rctl.Disable(*disableID) case CMD_ROLL: rctl.RollingUpdate(*rollOldID, *rollNewID, *rollWant, *rollNeed, *rollDelete) case CMD_FARM: rctl.Farm() case CMD_SCHEDUP: rctl.ScheduleUpdate(*schedupOldID, *schedupNewID, *schedupWant, *schedupNeed, *schedupDelete) } }
func New(preparerConfig *PreparerConfig, logger logging.Logger) (*Preparer, error) { addHooks(preparerConfig, logger) if preparerConfig.ConsulAddress == "" { return nil, util.Errorf("No Consul address given to the preparer") } if preparerConfig.PodRoot == "" { return nil, util.Errorf("No pod root given to the preparer") } if preparerConfig.LogLevel != "" { lv, err := logrus.ParseLevel(preparerConfig.LogLevel) if err != nil { return nil, util.Errorf("Received invalid log level %q", preparerConfig.LogLevel) } logger.Logger.Level = lv } var err error var authPolicy auth.Policy switch t, _ := preparerConfig.Auth["type"].(string); t { case "": return nil, util.Errorf("must specify authorization policy type") case "none": authPolicy = auth.NullPolicy{} case "keyring": var authConfig KeyringAuth err := castYaml(preparerConfig.Auth, &authConfig) if err != nil { return nil, util.Errorf("error configuring keyring auth: %s", err) } if authConfig.KeyringPath == "" { return nil, util.Errorf("keyring auth must contain a path to the keyring") } authPolicy, err = auth.NewFileKeyringPolicy( authConfig.KeyringPath, map[string][]string{POD_ID: authConfig.AuthorizedDeployers}, ) if err != nil { return nil, util.Errorf("error configuring keyring auth: %s", err) } case "user": var userConfig UserAuth err := castYaml(preparerConfig.Auth, &userConfig) if err != nil { return nil, util.Errorf("error configuring user auth: %s", err) } if userConfig.KeyringPath == "" { return nil, util.Errorf("user auth must contain a path to the keyring") } if userConfig.DeployPolicyPath == "" { return nil, util.Errorf("user auth must contain a path to the deploy policy") } authPolicy, err = auth.NewUserPolicy( userConfig.KeyringPath, userConfig.DeployPolicyPath, POD_ID, POD_ID, ) if err != nil { return nil, util.Errorf("error configuring user auth: %s", err) } default: if t, ok := preparerConfig.Auth["type"].(string); ok { return nil, util.Errorf("unrecognized auth type: %s", t) } return nil, util.Errorf("unrecognized auth type") } store, err := preparerConfig.GetStore() if err != nil { return nil, err } listener := HookListener{ Intent: store, HookPrefix: kp.HOOK_TREE, DestinationDir: path.Join(pods.DEFAULT_PATH, "hooks"), ExecDir: preparerConfig.HooksDirectory, Logger: logger, authPolicy: authPolicy, } err = os.MkdirAll(preparerConfig.PodRoot, 0755) if err != nil { return nil, util.Errorf("Could not create preparer pod directory: %s", err) } consulCAFile := preparerConfig.ConsulCAFile if consulCAFile == "" { consulCAFile = preparerConfig.CAFile } return &Preparer{ node: preparerConfig.NodeName, store: store, hooks: hooks.Hooks(preparerConfig.HooksDirectory, &logger), hookListener: listener, Logger: logger, podRoot: preparerConfig.PodRoot, authPolicy: authPolicy, caFile: consulCAFile, }, nil }