func TestBuildRunitServices(t *testing.T) { fakeSB := runit.FakeServiceBuilder() defer fakeSB.Cleanup() serviceBuilder := &fakeSB.ServiceBuilder pod := Pod{ P2Exec: "/usr/bin/p2-exec", Id: "testPod", home: "/data/pods/testPod", ServiceBuilder: serviceBuilder, LogExec: runit.DefaultLogExec(), FinishExec: DefaultFinishExec, } hl, sb := hoist.FakeHoistLaunchableForDir("multiple_script_test_hoist_launchable") defer hoist.CleanupFakeLaunchable(hl, sb) hl.RunAs = "testPod" executables, err := hl.Executables(serviceBuilder) outFilePath := filepath.Join(serviceBuilder.ConfigRoot, "testPod.yaml") Assert(t).IsNil(err, "Got an unexpected error when attempting to start runit services") testManifest := manifest.NewBuilder() testManifest.SetRestartPolicy(runit.RestartPolicyAlways) testLaunchable := hl.If() pod.buildRunitServices([]launch.Launchable{testLaunchable}, testManifest.GetManifest()) f, err := os.Open(outFilePath) defer f.Close() bytes, err := ioutil.ReadAll(f) Assert(t).IsNil(err, "Got an unexpected error reading the servicebuilder yaml file") expectedMap := map[string]runit.ServiceTemplate{ executables[0].Service.Name: { Run: executables[0].Exec, Log: runit.DefaultLogExec(), Finish: pod.FinishExecForLaunchable(testLaunchable), }, executables[1].Service.Name: { Run: executables[1].Exec, Log: runit.DefaultLogExec(), Finish: pod.FinishExecForLaunchable(testLaunchable), }, } expected, err := yaml.Marshal(expectedMap) Assert(t).IsNil(err, "Got error marshalling expected map to yaml") Assert(t).AreEqual(string(bytes), string(expected), "Servicebuilder yaml file didn't have expected contents") }
func newPodWithHome(id types.PodID, podHome string, node types.NodeName) *Pod { return &Pod{ Id: id, home: podHome, node: node, logger: Log.SubLogger(logrus.Fields{"pod": id}), SV: runit.DefaultSV, ServiceBuilder: runit.DefaultBuilder, P2Exec: p2exec.DefaultP2Exec, DefaultTimeout: 60 * time.Second, LogExec: runit.DefaultLogExec(), FinishExec: DefaultFinishExec, Fetcher: uri.DefaultFetcher, } }
func newPodWithHome(id types.PodID, uniqueKey types.PodUniqueKey, podHome string, node types.NodeName) *Pod { var logger logging.Logger logger = Log.SubLogger(logrus.Fields{"pod": id, "uuid": uniqueKey}) return &Pod{ Id: id, uniqueKey: uniqueKey, home: podHome, node: node, logger: logger, SV: runit.DefaultSV, ServiceBuilder: runit.DefaultBuilder, P2Exec: p2exec.DefaultP2Exec, DefaultTimeout: 60 * time.Second, LogExec: runit.DefaultLogExec(), FinishExec: NopFinishExec, Fetcher: uri.DefaultFetcher, } }
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 } authPolicy, err := getDeployerAuth(preparerConfig) if err != nil { return nil, err } artifactVerifier, err := getArtifactVerifier(preparerConfig, &logger) if err != nil { return nil, err } artifactRegistry, err := getArtifactRegistry(preparerConfig) if err != nil { return nil, err } store, err := preparerConfig.GetStore() if err != nil { return nil, err } maxLaunchableDiskUsage := launch.DefaultAllowableDiskUsage if preparerConfig.MaxLaunchableDiskUsage != "" { maxLaunchableDiskUsage, err = size.Parse(preparerConfig.MaxLaunchableDiskUsage) if err != nil { return nil, util.Errorf("Unparseable value for max_launchable_disk_usage %v, %v", preparerConfig.MaxLaunchableDiskUsage, err) } } listener := HookListener{ Intent: store, HookPrefix: kp.HOOK_TREE, Node: preparerConfig.NodeName, HookFactory: pods.NewHookFactory(filepath.Join(preparerConfig.PodRoot, "hooks"), preparerConfig.NodeName), ExecDir: preparerConfig.HooksDirectory, Logger: logger, authPolicy: authPolicy, artifactVerifier: artifactVerifier, artifactRegistry: artifactRegistry, } err = os.MkdirAll(preparerConfig.PodRoot, 0755) if err != nil { return nil, util.Errorf("Could not create preparer pod directory: %s", err) } var logExec []string if len(preparerConfig.LogExec) > 0 { logExec = preparerConfig.LogExec } else { logExec = runit.DefaultLogExec() } var finishExec []string if len(preparerConfig.FinishExec) > 0 { finishExec = preparerConfig.FinishExec } else { finishExec = pods.DefaultFinishExec } return &Preparer{ node: preparerConfig.NodeName, store: store, hooks: hooks.Hooks(preparerConfig.HooksDirectory, &logger), hookListener: listener, Logger: logger, podFactory: pods.NewFactory(preparerConfig.PodRoot, preparerConfig.NodeName), authPolicy: authPolicy, maxLaunchableDiskUsage: maxLaunchableDiskUsage, finishExec: finishExec, logExec: logExec, logBridgeBlacklist: preparerConfig.LogBridgeBlacklist, artifactVerifier: artifactVerifier, artifactRegistry: artifactRegistry, }, nil }
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 } authPolicy, err := getDeployerAuth(preparerConfig) if err != nil { return nil, err } artifactVerifier, err := getArtifactVerifier(preparerConfig, &logger) if err != nil { return nil, err } artifactRegistry, err := getArtifactRegistry(preparerConfig) if err != nil { return nil, err } client, err := preparerConfig.GetConsulClient() if err != nil { return nil, err } statusStore := statusstore.NewConsul(client) podStatusStore := podstatus.NewConsul(statusStore, kp.PreparerPodStatusNamespace) podStore := podstore.NewConsul(client.KV()) store := kp.NewConsulStore(client) maxLaunchableDiskUsage := launch.DefaultAllowableDiskUsage if preparerConfig.MaxLaunchableDiskUsage != "" { maxLaunchableDiskUsage, err = size.Parse(preparerConfig.MaxLaunchableDiskUsage) if err != nil { return nil, util.Errorf("Unparseable value for max_launchable_disk_usage %v, %v", preparerConfig.MaxLaunchableDiskUsage, err) } } err = os.MkdirAll(preparerConfig.PodRoot, 0755) if err != nil { return nil, util.Errorf("Could not create preparer pod directory: %s", err) } var logExec []string if len(preparerConfig.LogExec) > 0 { logExec = preparerConfig.LogExec } else { logExec = runit.DefaultLogExec() } finishExec := pods.NopFinishExec var podProcessReporter *podprocess.Reporter if preparerConfig.PodProcessReporterConfig.FullyConfigured() { podProcessReporterLogger := logger.SubLogger(logrus.Fields{ "component": "PodProcessReporter", }) podProcessReporter, err = podprocess.New(preparerConfig.PodProcessReporterConfig, podProcessReporterLogger, podStatusStore) if err != nil { return nil, err } finishExec = preparerConfig.PodProcessReporterConfig.FinishExec() } var hooksManifest manifest.Manifest var hooksPod *pods.Pod if preparerConfig.HooksManifest != NoHooksSentinelValue { if preparerConfig.HooksManifest == "" { return nil, util.Errorf("Most provide a hooks_manifest or sentinel value %q to indicate that there are no hooks", NoHooksSentinelValue) } hooksManifest, err = manifest.FromBytes([]byte(preparerConfig.HooksManifest)) if err != nil { return nil, util.Errorf("Could not parse configured hooks manifest: %s", err) } hooksPodFactory := pods.NewHookFactory(filepath.Join(preparerConfig.PodRoot, "hooks"), preparerConfig.NodeName) hooksPod = hooksPodFactory.NewHookPod(hooksManifest.ID()) } return &Preparer{ node: preparerConfig.NodeName, store: store, hooks: hooks.Hooks(preparerConfig.HooksDirectory, preparerConfig.PodRoot, &logger), podStatusStore: podStatusStore, podStore: podStore, Logger: logger, podFactory: pods.NewFactory(preparerConfig.PodRoot, preparerConfig.NodeName), authPolicy: authPolicy, maxLaunchableDiskUsage: maxLaunchableDiskUsage, finishExec: finishExec, logExec: logExec, logBridgeBlacklist: preparerConfig.LogBridgeBlacklist, artifactVerifier: artifactVerifier, artifactRegistry: artifactRegistry, PodProcessReporter: podProcessReporter, hooksManifest: hooksManifest, hooksPod: hooksPod, hooksExecDir: preparerConfig.HooksDirectory, }, nil }