func (s *SchedulerServer) prepareStaticPods() (data []byte, staticPodCPUs, staticPodMem float64) { // TODO(sttts): add a directory watch and tell running executors about updates if s.staticPodsConfigPath == "" { return } entries, errCh := podutil.ReadFromDir(s.staticPodsConfigPath) go func() { // we just skip file system errors for now, do our best to gather // as many static pod specs as we can. for err := range errCh { log.Errorln(err.Error()) } }() // validate cpu and memory limits, tracking the running totals in staticPod{CPUs,Mem} validateResourceLimits := StaticPodValidator( s.defaultContainerCPULimit, s.defaultContainerMemLimit, &staticPodCPUs, &staticPodMem) zipped, err := podutil.Gzip(validateResourceLimits.Do(entries)) if err != nil { log.Errorf("failed to generate static pod data: %v", err) staticPodCPUs, staticPodMem = 0, 0 } else { data = zipped } return }
// TestExecutorStaticPods test that the ExecutorInfo.data is parsed // as a zip archive with pod definitions. func TestExecutorInitializeStaticPodsSource(t *testing.T) { // create some zip with static pod definition givenPodsDir, err := ioutil.TempDir("/tmp", "executor-givenpods") assert.NoError(t, err) defer os.RemoveAll(givenPodsDir) var wg sync.WaitGroup reportErrors := func(errCh <-chan error) { wg.Add(1) go func() { defer wg.Done() for err := range errCh { t.Error(err) } }() } createStaticPodFile := func(fileName, name string) { spod := `{ "apiVersion": "v1", "kind": "Pod", "metadata": { "name": "%v", "namespace": "staticpods", "labels": { "name": "foo", "cluster": "bar" } }, "spec": { "containers": [{ "name": "%v", "image": "library/nginx", "ports": [{ "containerPort": 80, "name": "http" }] }] } }` destfile := filepath.Join(givenPodsDir, fileName) err = os.MkdirAll(filepath.Dir(destfile), 0770) assert.NoError(t, err) err = ioutil.WriteFile(destfile, []byte(fmt.Sprintf(spod, name, name)), 0660) assert.NoError(t, err) } createStaticPodFile("spod.json", "spod-01") createStaticPodFile("spod2.json", "spod-02") createStaticPodFile("dir/spod.json", "spod-03") // same file name as first one to check for overwriting staticpods, errs := podutil.ReadFromDir(givenPodsDir) reportErrors(errs) gzipped, err := podutil.Gzip(staticpods) assert.NoError(t, err) expectedStaticPodsNum := 2 // subdirectories are ignored by FileSource, hence only 2 // temporary directory which is normally located in the executor sandbox staticPodsConfigPath, err := ioutil.TempDir("/tmp", "executor-k8sm-archive") assert.NoError(t, err) defer os.RemoveAll(staticPodsConfigPath) executor := &Executor{ staticPodsConfigPath: staticPodsConfigPath, } // extract the pods into staticPodsConfigPath hostname := "h1" err = executor.initializeStaticPodsSource(hostname, gzipped) assert.NoError(t, err) actualpods, errs := podutil.ReadFromDir(staticPodsConfigPath) reportErrors(errs) list := podutil.List(actualpods) assert.NotNil(t, list) assert.Equal(t, expectedStaticPodsNum, len(list.Items)) wg.Wait() }