diff --git a/.gitignore b/.gitignore index 839ff3273..157274d8b 100644 --- a/.gitignore +++ b/.gitignore @@ -20,6 +20,5 @@ storage/_test_download docker/funnel deployments/kubernetes/**/funnel deployments/kubernetes/**/*.json -funnel dist/ .vscode \ No newline at end of file diff --git a/compute/kubernetes/backend.go b/compute/kubernetes/backend.go index e49e070ec..addd60363 100644 --- a/compute/kubernetes/backend.go +++ b/compute/kubernetes/backend.go @@ -147,11 +147,17 @@ func (b *Backend) createJob(task *tes.Task) (*v1.Job, error) { "Cpus": res.GetCpuCores(), "RamGb": res.GetRamGb(), "DiskGb": res.GetDiskGb(), + // TODO: How to handle multiple executors/images? + "Image": task.Executors[0].Image, }) if err != nil { return nil, fmt.Errorf("executing template: %v", err) } + fmt.Println("DEBUG: task.Id:", task.Id) + fmt.Println("DEBUG: b.template:", b.template) + fmt.Println("DEBUG: buf.String():", buf.String()) + decode := scheme.Codecs.UniversalDeserializer().Decode obj, _, err := decode(buf.Bytes(), nil, nil) if err != nil { @@ -165,7 +171,7 @@ func (b *Backend) createJob(task *tes.Task) (*v1.Job, error) { return job, nil } -// Submit submits a task to the as a kubernetes v1/batch job. +// Submit submits a task to the server as a kubernetes v1/batch job. func (b *Backend) Submit(ctx context.Context, task *tes.Task) error { job, err := b.createJob(task) if err != nil { @@ -176,7 +182,7 @@ func (b *Backend) Submit(ctx context.Context, task *tes.Task) error { FieldManager: task.Id, }) if err != nil { - return fmt.Errorf("creating job: %v", err) + return fmt.Errorf("creating job in backend: %v", err) } return nil } diff --git a/config/default-config.yaml b/config/default-config.yaml index 612812924..21b7b409a 100644 --- a/config/default-config.yaml +++ b/config/default-config.yaml @@ -3,7 +3,7 @@ Database: boltdb # The name of the active compute backend -# Available backends: local, htcondor, slurm, pbs, gridengine, manual, aws-batch +# Available backends: local, htcondor, slurm, pbs, gridengine, manual, aws-batch, kubernetes Compute: local # The name of the active event writer backend(s). diff --git a/config/internal/bundle.go b/config/internal/bundle.go index c6141670d..5ae7cb96e 100644 --- a/config/internal/bundle.go +++ b/config/internal/bundle.go @@ -3,10 +3,10 @@ // config/gridengine-template.txt (346B) // config/pbs-template.txt (361B) // config/slurm-template.txt (415B) -// config/kubernetes-executor-template.yaml (1.146kB) -// config/default-config.yaml (11.633kB) +// config/kubernetes-executor-template.yaml (1.135kB) +// config/default-config.yaml (11.655kB) // config/htcondor-template.txt (505B) -// config/kubernetes-template.yaml (1.371kB) +// config/kubernetes-template.yaml (1.354kB) package config @@ -134,7 +134,7 @@ func configSlurmTemplateTxt() (*asset, error) { return a, nil } -var _configKubernetesExecutorTemplateYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x84\x54\x4d\x6f\x9b\x40\x10\xbd\xf3\x2b\x46\x24\xbd\x05\x42\x2e\x3d\x20\xf5\x60\xd9\x95\xe3\xa8\x21\x56\x63\xa5\x87\xaa\x87\x65\x3d\xd8\x5b\xf6\xab\x3b\x8b\x53\x0b\xf9\xbf\x57\x0b\x18\xe1\x54\x4d\xf7\x34\x9e\x37\xf3\xe6\xbd\xf1\x08\x66\xc5\x0b\x3a\x12\x46\xe7\x50\x32\xcf\xf7\xb7\x87\xbb\xa8\x16\x7a\x9b\xc3\x83\x29\x23\x85\x9e\x6d\x99\x67\x79\x04\xa0\x99\xc2\x1c\xda\x36\xdd\x30\xaa\x57\xdb\xd3\x29\x69\xdb\xf4\xc1\x94\x21\x1c\x60\xb2\x8c\xf7\x35\xc5\xf9\x57\x87\x49\x56\xa2\xa4\x40\x02\xf0\xd3\x94\xc9\xbb\x54\x64\x91\xe7\x10\x01\x94\x8c\xd7\xa6\xaa\xbe\x08\x25\x7c\x0e\x59\x04\xc0\x8d\xb2\x12\xbd\x30\x9a\x72\xb8\x8b\x00\x3c\x2a\x2b\x99\xc7\x9e\xba\xeb\xec\x22\x00\x87\xe4\x99\xf3\x6b\x23\x05\x3f\xe6\x50\xe0\x01\xdd\x00\x11\xba\x83\xe0\x38\xe3\xdc\x34\xda\x17\x67\x2d\xcf\x17\xe9\x4e\x77\x78\xdc\x68\xcf\x84\x46\x47\x9d\xa8\xf0\x92\x61\x17\x55\xa3\x35\xca\xe4\xd5\xb8\x1a\x5d\x32\xb1\x33\xd4\x01\x08\xc5\x76\x3d\xfb\x2a\x44\x6f\x91\x75\x23\xe5\x59\xe1\x4c\xbe\xb2\x23\x8d\x38\x37\x4a\xb1\xf0\x37\x7c\x8f\x6f\x4b\xa1\x6f\x69\x1f\xdf\x40\x9c\xf0\xf8\xc7\x58\xc2\xdc\x8e\x3a\xee\x79\x5f\x3b\x61\x0f\x92\x84\xde\x2d\x84\xeb\x0a\xbe\x19\x57\x6f\x85\x9b\x14\x38\x24\xd3\x38\x8e\x94\x8f\xa9\x90\xfc\xd5\x20\xf9\x8b\x1c\x00\xb7\x4d\x20\x11\x15\x68\x84\x74\x6e\x1b\x82\x0c\x92\xd3\x29\x0c\xb6\x0d\x85\x00\x50\x12\x42\x88\xe2\xbb\x2c\x53\x71\x88\xf0\x42\x50\x78\x0a\x95\x71\xc7\x09\xd7\x57\xa6\x96\x25\x64\xe9\x40\x67\x9d\xd0\xbe\x82\xf8\x43\x9a\x55\xcb\x78\x80\x3b\x2a\x49\xd8\x93\x7f\x7c\xfc\x07\x37\xda\x3d\x2a\x74\x4c\x26\xe4\x8d\x1b\x96\x3e\x8c\x59\x08\xaa\xdf\x9b\xd3\xe3\x97\x83\xb2\x6c\x3a\x69\x1c\x75\x30\xb2\x51\xf8\x18\x0e\x64\xb2\xa5\xab\xab\x2b\x58\x3c\x41\xf1\xb4\x81\xf9\xfd\xac\x58\x7e\x86\xcd\xfd\xea\x79\x84\xdb\xd6\x31\xbd\x43\xb8\x16\xdb\xdf\x37\x70\x2d\x3c\x2a\xc8\x3f\x41\xfa\xd2\x91\xd1\xc4\xc9\xf9\xb0\x06\x0f\x30\xb1\xa8\xc2\xcc\x35\xf3\xfb\x60\xac\xe3\x48\xe7\xe7\xcb\x0c\xe9\x8b\x7d\x50\x53\x8e\xa5\xe3\x51\xfe\xaf\xed\x8d\xd9\xde\xea\xdf\x47\x3f\x68\x1b\xdb\x6c\xf8\x7c\x90\x47\xed\x7b\x3f\x73\xc9\x84\x9a\x5e\x10\x0f\x89\x62\xda\x9b\xd8\x03\x87\x3f\x01\x00\x00\xff\xff\x5e\x3e\xe4\x77\x7a\x04\x00\x00") +var _configKubernetesExecutorTemplateYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x84\x54\x4f\x6f\xdb\x3e\x0c\xbd\xfb\x53\x10\x6e\x7f\xb7\xda\x75\x2f\xbf\x83\x81\x1d\x8a\x64\x48\x53\xac\x69\xb0\x05\xdd\x61\xd8\x41\x56\xe8\x44\xb3\xfe\x4d\x94\xd3\x05\x46\xbe\xfb\x20\x5b\x31\x9c\x0e\xeb\x74\x62\xf8\x1e\x1f\xf9\x08\xc6\xcc\x8a\x17\x74\x24\x8c\x2e\xa1\x62\x9e\xef\x6f\x0f\x77\x49\x23\xf4\xb6\x84\x47\x53\x25\x0a\x3d\xdb\x32\xcf\xca\x04\x40\x33\x85\x25\x74\x5d\xbe\x61\xd4\x2c\xb7\xa7\x53\xd6\x75\xf9\xa3\xa9\x42\x18\x61\xb2\x8c\x0f\x9c\xd5\xf9\x57\x8f\x49\x56\xa1\xa4\x20\x02\xf0\xc3\x54\xd9\xbb\x52\x64\x91\x97\x90\x00\x54\x8c\x37\xa6\xae\x3f\x09\x25\x7c\x09\x45\x02\xc0\x8d\xb2\x12\xbd\x30\x9a\x4a\xb8\x4b\x00\x3c\x2a\x2b\x99\xc7\x41\xba\xaf\xec\x23\x00\x87\xe4\x99\xf3\x6b\x23\x05\x3f\x96\xb0\xc2\x03\xba\x08\x11\xba\x83\xe0\x78\xcf\xb9\x69\xb5\x5f\xf5\xb3\xd4\xad\xd6\x28\x33\x62\x91\xc3\x8d\xf6\x4c\x68\x74\xd4\x8f\x12\x5e\x16\x37\x10\xa9\xaf\xc6\x35\xe8\xb2\x89\x89\xc8\x03\x10\x8a\xed\x06\x7f\xcb\x10\xbd\x45\xd6\xad\x94\xe7\xb9\xee\xe5\x2b\x3b\xd2\x88\x73\xa3\x14\x0b\xcb\xff\x96\xde\x56\x42\xdf\xd2\x3e\xbd\x81\x34\xe3\xe9\xf7\x91\xc2\xdc\x8e\x7a\xed\xd9\xc0\x9d\xa8\x87\x91\x84\xde\xcd\x85\xeb\x09\x5f\x8d\x6b\xb6\xc2\x4d\x08\x0e\xc9\xb4\x8e\x23\x95\x63\x2a\x24\x7f\xb6\x48\xfe\x22\x07\xc0\x6d\x1b\x44\x44\x0d\x1a\x21\x9f\xd9\x96\xa0\x80\xec\x74\x0a\x8d\x6d\x4b\x21\x00\x94\x84\x10\xa2\xf4\xae\x28\x54\x1a\x22\xbc\x18\x28\x3c\x85\xca\xb8\xe3\x44\xeb\x33\x53\x8b\x0a\x8a\x3c\xca\x59\x27\xb4\xaf\x21\xfd\x2f\x2f\xea\x45\x1a\xe1\x5e\x4a\x12\x0e\xe2\xff\x3f\xfd\x45\x1b\xed\x1e\x15\x3a\x26\x33\xf2\xc6\xc5\xa5\xc7\x36\x73\x41\xcd\x7b\x7d\x06\xfc\xb2\x51\x51\x4c\x3b\x8d\xad\x0e\x46\xb6\x0a\x9f\xc2\xb5\x4c\xb6\x74\x75\x75\x05\xf3\x67\x58\x3d\x6f\x60\xf6\x70\xbf\x5a\x7c\x84\xcd\xc3\xf2\xcb\x08\x77\x9d\x63\x7a\x87\x70\x2d\xb6\xbf\x6e\xe0\x5a\x78\x54\x50\x7e\x80\xfc\xa5\x17\xa3\x89\x93\xf3\x61\x45\x0f\x30\xb1\xa8\x42\xcf\x35\xf3\xfb\x60\xac\xd7\xc8\x67\xe7\xcb\x0c\xe9\x8b\x7d\x50\x5b\x8d\xd4\xf1\x28\xff\x55\xf6\xc6\xec\x60\xf5\xcf\xa3\x8f\xb3\x8d\x65\x36\x7c\x34\xc8\xa3\xf6\x83\x9f\x99\x64\x42\x4d\x2f\x88\x87\xc4\xc5\x7f\xcb\x1e\x38\xfc\x0e\x00\x00\xff\xff\x04\xcd\x20\x4b\x6f\x04\x00\x00") func configKubernetesExecutorTemplateYamlBytes() ([]byte, error) { return bindataRead( @@ -149,12 +149,12 @@ func configKubernetesExecutorTemplateYaml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "config/kubernetes-executor-template.yaml", size: 1146, mode: os.FileMode(0644), modTime: time.Unix(1728510735, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x7e, 0xb, 0xc5, 0x3f, 0x73, 0xdc, 0x5d, 0x4a, 0x1d, 0x40, 0xd0, 0x8b, 0x31, 0xaa, 0x77, 0xf1, 0xa, 0x93, 0x8e, 0x32, 0xce, 0xaa, 0xa5, 0x9d, 0x7e, 0xa5, 0xa8, 0x96, 0x13, 0xe1, 0x74, 0xd4}} + info := bindataFileInfo{name: "config/kubernetes-executor-template.yaml", size: 1135, mode: os.FileMode(0644), modTime: time.Unix(1729109797, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd2, 0x50, 0x93, 0xa6, 0xe6, 0xeb, 0xd, 0x68, 0x45, 0x70, 0x64, 0xcc, 0x9c, 0xdd, 0xbf, 0x81, 0xd4, 0xd, 0xa9, 0x8d, 0xdd, 0xba, 0xe7, 0xa9, 0x23, 0xa, 0x69, 0xa5, 0x10, 0xdd, 0xd8, 0xf7}} return a, nil } -var _configDefaultConfigYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x3a\x5d\x73\xdc\x38\x72\xef\xfc\x15\x1d\xcd\x5e\xc5\x5b\x35\x5f\xda\xad\xbd\xe4\x58\xa5\x07\x7d\xad\xad\x58\xf6\x2a\x9a\x71\x9c\x3c\xb9\x40\xa2\x39\xc4\x0e\x09\x70\x01\x50\xe3\xb1\xe3\xff\x9e\xea\x06\xf8\x31\x92\xbc\xf6\xdd\xc9\x55\x9b\xba\xd3\x8b\x86\x40\xa3\xd1\xe8\xef\x6e\x60\x02\xeb\x12\x41\x8b\x1a\xc1\x14\xe0\x4b\x04\x91\x7b\x75\x87\xe0\xd0\xde\xa1\x05\x29\xbc\xc8\x84\x43\xc8\x44\xbe\x45\x2d\x93\x09\x9c\xde\x09\x55\x89\xac\xea\xc7\x5c\x0a\x99\xa9\xbc\xcc\xa6\x90\x09\xb9\x41\x3b\xe5\x65\xce\x1b\x8b\x53\x90\x7b\x2d\x6a\x43\x93\x58\x09\xe7\x55\x3e\x85\xda\xe8\x8d\x91\x59\x72\x11\x91\x77\xeb\x93\xe4\xb3\xe4\xe4\xa6\x6e\x5a\xff\x25\x32\x2a\x93\x8b\x6a\x0a\xa5\xcf\x8d\x96\xc6\x4e\xc1\x55\xad\xad\xa7\xd0\x64\x6e\x0a\x1b\xab\x24\xea\x8d\xd2\x38\x85\x5a\xe8\x96\x20\xc5\xce\xcd\x32\xe1\xf3\x32\x39\x0f\x1b\x44\x1c\xbf\x43\x09\xde\xa1\xf6\xb0\xb3\xca\xa3\xed\xb6\x7e\xe6\xbe\x9f\x7f\x96\xa4\xcd\xf4\x6f\x63\xcf\x14\xb6\xa2\xd8\x8a\xe4\x92\x36\x7c\xcb\xfb\xb9\x34\x01\x98\x75\xdc\xa2\x9f\x95\xd9\x24\xc9\xb5\xd9\x6c\xd0\xd2\xdc\x04\xe8\xb7\xd2\x1b\xa8\xf0\x0e\x2b\x97\x82\xc4\xac\xdd\x4c\x41\xe9\xc2\x4c\x01\xad\x35\x36\x01\xb8\xa6\xc9\x94\x07\x79\x11\x63\x27\x5c\x0e\xbc\x01\x5f\x2a\x07\x8d\xf0\xe5\x1c\xae\x0a\xc0\xba\xf1\xfb\x69\x98\x14\x16\xf9\xe4\x1e\x35\x01\x3a\x2f\xd1\xda\x79\x02\xf0\x4b\xeb\x9b\xd6\xff\xac\x2a\x4c\xe1\xe8\x28\x49\x56\xac\x3d\x81\xa2\x17\xc6\xf9\x31\x1f\x7f\x6e\xb5\xc6\x2a\x2a\x18\x2d\x26\x80\xd7\xa2\xee\x78\x5f\x1a\xe7\x13\x5e\x79\x63\xac\x87\xd6\xa1\x84\xc2\x58\x78\xb1\x5e\xdf\x90\x1e\xd4\xad\x56\xb9\xf0\xca\x68\x10\x5a\x32\xca\x1d\x66\x20\x85\x2b\x33\x23\xac\x64\x94\xeb\xf5\x0d\xad\x4e\xe1\xdf\x97\xcb\xe5\x63\xd8\x6e\x6f\xce\x0f\x91\xd1\xb2\xdb\x9b\xf3\xb0\xea\x2f\xcb\xbf\xc4\x55\xb7\xf8\x5b\xab\x2c\x49\xd4\xa9\x1c\x44\xeb\x4b\xd4\xbe\xdb\x9f\x10\xd1\xfe\xd1\x58\x4e\x6f\xae\x1c\xb4\x8e\xd8\x2f\xa0\x11\xce\xed\x4c\x20\x67\x42\x8c\xa4\xad\x49\xf3\xb6\x08\xae\xb5\x48\x0c\x6c\xac\x69\xd0\x56\x7b\xb0\xe8\xbc\x55\xb9\x07\x91\xe7\xe8\xa2\x14\x48\xeb\x75\xa1\x36\x50\xa8\x0a\x19\xcb\x33\x9c\x6f\xe6\x90\x97\xb5\x91\xf0\xe7\xe5\x12\x0a\x66\xe5\x3c\x80\xcd\xf7\x75\xf5\x3d\x83\x9d\x11\xad\xa7\xad\x2f\x83\x00\x48\x4f\xde\x38\xb4\x29\x91\x60\x8f\xe3\x18\xc0\x4d\xa4\x30\x05\x91\xe5\xc7\x3f\xfc\xf8\x08\xf0\x0f\x8f\x00\x17\xc6\x64\xc2\x06\xee\x5c\xe9\xbc\x6a\x25\x82\x80\xa3\x73\x91\x97\x38\x3b\x37\xda\x5b\x53\xa5\xa0\xcd\x8c\x35\xfc\x28\xc8\xad\x44\x21\xd1\x82\xd2\xf0\x1c\xfd\xe2\x5a\x39\x4f\x67\x6e\x8c\x76\xe8\x18\x13\x73\x23\xd8\x56\x2e\xf2\x92\x78\x98\xed\x41\x69\x8f\xb6\x46\xa9\x84\xdd\x33\x97\x55\x8e\x8e\x38\x7a\xa1\x1c\x19\x1a\xe1\xe6\x8d\x53\xf0\xb6\xc5\x24\xb9\xbd\x39\x3f\xaf\x14\x6a\x1f\x8e\x4e\x52\x8e\xc2\x11\x52\x5a\x74\xb4\x59\x50\xce\xd3\xf0\x3d\x52\xba\x74\x90\xfa\xb9\x45\x49\x72\x16\x95\x63\x21\x9f\xfd\x3f\x92\x7e\x90\x5e\x98\x0c\x8a\x7f\x5f\xce\x3c\x9a\x1b\xad\x31\xe7\x83\x78\x55\xa3\x69\x3d\xd1\xba\x0e\x3f\x53\xf8\xf3\xd2\x05\x38\x72\x83\xb5\x78\xaf\xea\xb6\x06\xdd\xd6\x19\x5a\x36\x64\x55\xa3\x03\x5f\x0a\x0f\x02\x2c\xfe\xd6\xa2\xf3\xb0\x53\x55\x05\x19\x82\x45\x6f\x55\xb4\xb3\x42\xa8\xaa\xb5\x41\x68\x13\x46\x0f\x19\xfa\x1d\xa2\x8e\x60\xc4\xe0\xaa\x32\x3b\x07\x42\x03\xbe\x6f\x8c\x0e\x8c\x67\x1f\x6a\x8a\x02\x9c\x17\xd6\x33\x57\x3d\xfc\x04\x0e\xc9\xb7\x07\x9d\x69\x1b\x62\xd5\x31\xd4\x4a\xb7\x9e\x78\xf4\x4a\xbc\xbf\x0d\x48\x53\x38\x5e\x76\x4e\xdc\xe5\x25\xca\xb6\x22\xf5\x73\x83\x03\x20\x0e\xbf\xe2\x30\x70\x3f\xb8\xcc\x93\x55\xb7\xa2\xf3\x60\x3b\x30\x45\x74\x7a\xb6\xd5\x20\xc6\x38\x3d\xda\xde\x81\x74\x0b\x6f\x05\x85\x92\x63\xd7\x2f\xaf\x85\xde\x83\x17\x6e\xcb\xd2\xed\x56\x93\x3d\x18\x8d\x8f\xe3\x38\x2f\x5b\xbd\xe5\x73\x74\x48\x2a\xa3\x37\xb4\x7c\x27\x94\xef\xb9\xd8\x36\x52\x78\x74\x90\x61\x61\x2c\x89\xca\x6e\x83\x0a\x6a\x23\x11\x24\x0a\xd6\xc1\xd7\x46\xe2\x8d\xd2\x9b\x5e\xbe\xc7\xf5\xe3\x68\x89\x35\x71\x2d\x7b\x78\x61\xfd\xf4\x3e\x6e\x62\xdd\x03\xec\x57\x5a\xf9\x1e\xfb\x4f\x75\x92\xd0\x60\xda\xa9\x7f\x8c\x22\x11\xf3\xd5\x45\xaf\x2b\xa2\xf5\xa6\x16\x64\x53\x55\xb5\x87\x0d\x6a\xe2\x04\x32\xd6\xab\x8b\x10\x4c\x22\x8a\x7e\xd7\x52\xd0\x69\x51\x83\x92\x15\x32\xc1\x74\x02\x24\x91\x0a\xcd\x60\x51\xa1\xa7\xa0\xa2\x52\xba\xb2\xf5\x20\xcd\x4e\x07\x35\x9c\x1d\x43\x8d\x42\x93\x02\xa3\x45\x52\x0b\x6d\x7a\x2b\x80\x65\x37\x19\x06\x40\xd5\xec\x81\x3c\x56\x7b\x10\x85\xc7\xa0\x3b\x85\xb2\xce\xb3\x48\x0f\xec\x66\x76\x1c\xed\xe6\x94\xb9\x12\xb6\x3f\x3c\xa4\xb7\x7b\xe2\xad\x44\x8f\xb9\x87\x1d\xd9\x90\x45\x67\x5a\x9b\x63\x08\xb1\xa2\xcf\x23\xbc\x01\xe5\x03\xcd\x17\x58\x28\x4d\xdc\xbf\xed\x61\x55\x38\x2d\xef\x13\xbc\x40\x1b\xd4\x08\xcc\x1d\x5a\x4a\x77\x5c\x08\xe6\x19\x96\xe2\x4e\x19\x8e\xb6\xfd\x72\x92\x0d\xfb\xba\x9b\x37\x6e\xd8\x72\xde\x8d\x36\xad\x4b\x81\xdd\x21\x3b\xd2\xd3\x57\x03\xcc\x94\xfd\xf8\x59\x07\x7a\x2b\xea\xe7\x59\x0a\xcb\x79\x0f\x7d\xa1\xdc\x16\x5c\x23\x72\xfc\xec\x22\x02\x19\xad\x9a\xc0\xcf\x2c\xc7\xdd\x8c\x13\x17\xf0\x2d\x9d\x75\xfe\xd0\xfc\xdc\x5e\xe7\xb0\x53\xbe\x7c\x3c\x97\x78\xc3\xd6\x10\xcc\xef\x27\x97\x24\x6f\x8d\xdd\x76\x66\x4c\xe9\x89\x83\xdc\x22\x29\x18\xc8\xd6\x12\x37\x1b\x6b\xc8\xe7\xd2\xcf\x4e\x25\xbb\x0c\x87\xd9\xab\x1c\x48\x65\x31\xf7\xc6\xee\x69\x03\x42\x78\xa1\x6c\x0a\xf3\x45\x70\xb1\xb3\x9d\xb1\xdb\x99\x54\xf6\xaf\x3a\x46\x63\xaa\x8a\x55\x37\x17\x3a\xa7\x13\xa8\x8d\x16\x15\xf9\x8b\x1b\x53\x55\x4a\x6f\x86\x23\xfc\x35\xcc\x41\x2d\x29\x2b\x33\xad\x5f\xa0\xb5\xac\x9d\x94\xb9\xf5\x4e\x22\x46\x96\x07\x6c\x9b\xc0\x0a\xbd\x0f\xb6\xad\x18\x6c\x19\xd8\x61\xd1\xb5\x95\x8f\x9a\xe6\x48\xeb\xb1\x92\xa4\x50\x04\x1b\xb0\x4a\x72\x87\x4a\x6f\xaa\x60\x77\x8c\x6d\x30\x13\x7c\x8f\x79\xeb\x8d\x05\x7c\xaf\x3c\x47\x81\x6b\xb3\xb9\x2f\x25\x5a\xf2\x4a\xbc\x87\x6c\x1f\x89\xe4\xd4\x81\xf9\x33\x3a\x4d\x54\xf7\xee\x50\x11\xd7\x5a\xa8\x6a\xa5\x3e\x90\xbb\x5d\x2e\x97\x4b\x98\xc0\xf1\x12\x5e\x9e\x05\xa4\xaf\x8d\xad\x83\xcd\x51\x96\xc8\xba\x00\x12\x2b\xa4\x6d\x94\x77\x3c\x44\x27\xe9\x45\x1c\x29\x0f\x54\xf7\x4c\x5e\x13\x53\x4c\xc3\xa6\x25\x43\xe6\x11\x83\xdf\xd8\xb2\xae\x51\xdc\x61\xaf\x1f\x85\xa8\x1c\x06\x2a\xae\x55\xad\x7c\xf0\x5f\x7d\x00\xcd\x8d\xce\x5b\x6b\x29\xdf\x21\xbf\x54\x19\x21\xdd\xa2\x6d\xf8\x7f\x88\x64\x37\xc2\x8a\xaa\xc2\x6a\x6d\x85\x76\x05\x25\xff\x21\xa6\xcd\x9e\xf6\x2f\x99\x40\x57\x87\x51\x08\x96\x0b\x63\x81\x4b\x0e\x88\x35\xc7\xe2\x85\xd0\xb2\x42\xeb\x9e\x7e\xeb\xe4\xcc\x54\xfe\xe2\x2c\x8d\x69\x0a\x19\x75\x50\xd0\xbe\xec\x8c\xc9\x0f\xcd\x3d\x62\x72\xf1\x7b\x4e\xa5\xe3\x05\x17\x52\x1d\xb2\x33\xe1\x90\x8b\x0e\x6f\x28\xe4\xb3\x2a\x75\xa5\x16\x78\x16\x20\x79\x6d\xfa\xd1\x81\x1e\xe4\x4c\xa7\x6f\x57\x60\x71\xa3\x8c\x66\x97\x49\x3f\x38\x18\x75\x73\xa7\x21\x53\xdb\xe2\x1e\xae\x2e\x12\x80\x97\xb8\x3f\x98\x5f\x61\x6e\xd1\x77\x60\x2f\x71\xcf\x79\x27\x8d\x85\x98\x76\x19\x8a\xbd\x78\x72\x8b\x85\x7a\x3f\x26\x55\x69\x89\xef\xd1\xc1\x33\x52\xf6\x69\xa8\x39\xdd\x94\xc3\x9f\xa3\x2c\xef\x8a\xe6\xc3\xb2\x03\xb2\xdf\xdc\x5e\x77\x65\x56\x2c\x27\x1d\x0a\x9b\x97\x63\x0f\x79\x7b\x9d\x42\xe9\x7d\x93\x2e\x16\xa3\xd4\xf7\x87\x25\xe7\x4b\xcf\x8d\x21\x43\x3e\xaf\x4c\x2b\x59\x2f\x82\x25\xb2\xcd\x75\x42\x99\x27\xfd\x04\xd1\x7f\x63\xcd\xaf\x98\xfb\xfe\xf8\x9d\x1c\x45\x9e\x9b\x96\xd2\xf9\x71\x2e\xad\x42\x84\x99\xc0\x2f\x6c\x4d\xa2\xe2\x1a\xb3\x31\xce\x29\x8e\x11\x63\xe0\xc7\x53\x04\xa9\x5c\x4e\xe1\x0d\x25\xe3\x29\xac\xa9\xc3\x79\xf5\x9d\xb2\x46\xd7\xa8\x39\x60\x8e\x32\xf8\xa1\x2c\x7d\x45\x95\x75\xa7\x22\x54\x00\x38\x28\x0d\xf9\x33\xae\xef\x43\x41\x80\x6e\x94\xd8\xa3\x8c\x9c\x63\xcf\xc5\x2b\x42\xd8\x9c\x8d\x6a\x55\x0e\x67\x9d\xc2\x2a\x77\xa8\xc0\xac\x84\x9c\x74\x52\xd0\x52\x1a\x22\x0d\x23\x2f\x17\x9c\x31\xad\xe0\xca\xa6\x6f\x8a\x8c\xe4\xba\xee\x52\x91\x48\x6a\xcd\x9c\x8d\x79\xf8\xbd\xdc\x2d\x96\x23\x94\xaa\x72\x85\x25\x61\x57\xa2\x0e\xcc\xe2\x9c\xa5\xcb\xfc\x29\x4b\xd4\x12\xb8\x92\xa1\x0c\x9c\xf2\x69\xaa\x48\x38\x85\xe8\xb3\x0b\x47\xd1\xd1\x68\x92\x53\x28\xd4\x06\x52\x3e\xa0\x35\xd3\x50\xaa\x88\xaa\x82\x5a\xec\x21\xab\x4c\xbe\x25\x42\x90\x68\x20\xaa\x68\x9b\x40\xd8\x50\x71\x74\x15\x5f\x86\x80\x8e\xac\x51\xb9\x32\xe4\x7c\xe3\x0c\xb2\x2b\x66\x98\x85\x44\x69\x57\xc8\x70\xe3\xc2\x06\xb1\xe7\xf7\x2a\x35\x1a\x53\x5a\x71\x05\x71\x58\xaf\x31\x3e\x49\xe9\xb6\xd1\x87\x32\x92\x94\x5a\xa1\xa4\x82\x93\xc6\x2f\x06\xe7\x83\x15\x53\xd5\x51\x11\x75\x7c\x28\xa8\x48\xa9\x5e\x8a\x62\x2b\xd2\xbe\xae\xec\x15\x84\x41\xd7\xa6\x51\x79\x2f\xca\x6f\xe1\xbc\x63\xe3\x0a\xce\x62\xcb\xe9\x1b\x78\xe9\x17\xeb\x73\xee\xa7\x05\xbb\x59\xb7\x56\x03\x15\x66\xec\x14\x9c\x17\x9e\x2a\x3e\x8a\x67\xaa\x42\x3b\x87\xb7\x25\x6a\x40\x4d\xae\x55\x4e\xbb\x54\x63\x68\xb5\xa0\x1b\xd2\xb7\x17\x37\xe7\x8c\x72\xa8\xa6\xbc\x81\x42\x69\xd9\x95\x4a\x5c\x5f\x5a\x04\xe7\xdb\x7c\x4b\x1a\x29\xe0\xb7\x16\x5b\x32\x4b\xde\x97\xf2\x0a\x6b\x8d\xa5\x24\x44\xcb\x58\x14\xc6\x54\xa7\x4b\x15\x02\x24\x79\x23\x2b\x29\x4d\xd9\x8f\xfa\x07\xb7\x3d\xdd\xb1\x81\x10\x5a\x3e\x71\x90\x12\x14\xd2\xf3\x72\xc8\xb1\xca\x07\xad\x48\xfe\x16\x16\x5d\xd8\x88\xed\x26\x1c\xfa\x5f\x5d\xdf\xae\x8c\xfa\xee\x4b\xe3\x88\x59\x8d\xb1\x7e\xd0\xb7\x01\xe8\x60\x67\x0a\xf7\x64\x04\x6b\xac\x9b\x4a\x78\xec\xdd\xd8\x30\x94\xc2\xff\xb2\xb2\xb5\x5a\x91\xe6\x21\x9c\xc0\x9d\xd0\xaa\xaa\x04\x0f\x6f\xd0\xa3\xbe\x83\x13\x58\x87\xa3\x41\xcc\x6b\xb8\xb4\x38\x81\x8f\x1f\xe7\x97\xfd\xf7\xa7\x4f\x0c\x20\xec\xa6\x25\x17\xea\xe0\xa4\xcb\x97\xa8\xe0\x9d\xcd\x62\x33\xe2\xe3\xc7\xf9\x39\xff\xfa\xf4\x09\x66\x33\xe2\xef\x4c\x49\x1a\x5d\x0b\xb7\xbd\x92\x11\x0b\xa5\x9c\x8c\x3f\x66\x43\x9f\x3e\x2d\x42\x47\x76\xc6\x91\x6c\x56\x99\x4d\x20\x87\x64\x77\x1f\x32\xc6\xf8\xd0\x5c\x64\x30\xc3\xdd\xc5\xcf\xc3\x99\xd6\x33\x9c\x2b\x4d\x5b\xc9\x77\x3e\x26\x4c\xef\x0a\x4e\xf8\x4f\xe0\x7f\x2e\x57\x3c\x4f\x7e\xf0\x9d\x37\x03\x40\x8f\xf8\x97\xd7\xef\x2e\xff\xfb\x6a\xfd\xee\x97\xdb\x77\x97\xff\x75\x75\xbe\x66\xf0\x8f\x1f\x55\x01\x1a\x61\x4e\xb5\x10\x2c\x61\x16\x4f\xf7\xf1\x63\x63\x95\xf6\x05\x1c\xc5\xc6\xc7\xbb\x9c\x00\x4e\xe0\x4f\xf2\x28\x00\xf7\x80\x33\x40\x2d\xfb\xaf\x88\x8e\xeb\x25\x2a\x7c\x7e\x07\x63\x8d\x35\x65\xa3\x27\xf0\xa7\xf9\xb2\x80\xe7\x67\x47\x71\xd9\xef\x63\x0e\x45\xd5\x17\x50\x4b\x2a\xce\xc6\x88\xc3\xaa\x07\x98\xf9\x93\xad\x2d\x49\x6e\xce\x56\xff\x34\xfe\x3f\xa8\xf1\x4f\xfe\x25\x53\x7a\x91\x09\x57\x86\xcf\x9b\xb3\x15\xcc\x5e\x3f\xb0\xc9\x30\x6e\xbe\x64\x43\x01\x0c\xbf\x64\x92\x5f\xb6\x8d\x80\xa8\x0a\x39\xeb\xc9\x71\xda\x34\xfa\xe4\x09\x0c\xa4\x43\x5b\x63\x7d\x42\x2a\xbc\xc9\x9e\xc0\x34\x3a\xa4\xe4\x30\x06\xac\xbf\x67\x17\xf7\x7c\xe7\x57\xfa\xca\xab\x8b\x03\xb1\x24\xcf\xad\x92\x97\x7c\x25\x95\xfe\x6d\xb2\xfe\xee\x51\x49\x7f\xf7\x35\x72\xfe\xee\x2b\xa4\x4c\x40\xbd\x04\xbf\x56\xee\xdf\xc1\xac\x41\xa8\x1b\xf5\x14\xfe\x30\x50\x50\xbe\xbb\xeb\xe4\xfd\xfc\x29\xc4\x1d\x91\x16\x4e\x7d\xc0\x1e\xeb\xb7\x17\xf7\xaa\x6a\x6d\xfd\x4f\x3f\xfa\x87\xf5\xa3\x8b\x43\xe3\x5a\x9d\x9d\xae\xcf\x5f\xc0\x6c\xf6\xab\xc9\x66\x5c\x84\x3c\xb0\xb4\x1e\x44\x07\x5e\x1f\xdf\x1b\x0e\x09\xce\x97\xac\xac\x07\x8f\xf9\xc8\x17\x4c\xf7\x2b\x6c\xb0\xc7\x48\x99\xc9\xac\x41\xcb\xfa\xf8\x24\x06\xd9\xa3\xae\xb1\xe6\x24\xe2\x49\x92\x93\x01\xad\xaf\x9b\x01\xed\xb7\xb7\x49\x6e\xd7\x9c\x09\x9f\x97\x20\xd1\xe5\x56\x65\x51\xed\x0f\x1b\xea\x5d\x69\x79\xfa\x76\x05\x01\xfa\xc1\xa5\x51\x87\xe7\x49\x0d\xbc\xdf\xaf\xd3\xfe\xfb\x86\xad\xb9\xd0\xe6\x7b\x9a\x60\xbf\x83\xed\xfe\xe1\xed\x76\x7c\xb8\x47\xad\x76\x02\xff\x61\xb2\x70\xf1\xc1\x52\xc8\x85\xe6\x9e\x81\xf2\x25\xf2\x35\x15\x3f\x2b\x88\x92\xa9\xc5\x07\xa3\xfb\xeb\x0d\x78\x4d\x73\xcf\x4e\x6f\x5f\x7f\x4f\x47\x3e\xc0\x93\xc2\x51\xb4\x2a\xb2\x6c\x89\xc5\x51\xb7\xd7\x7f\x92\x5f\xfc\xfb\xb6\x61\x14\x87\x3b\xb0\xb7\x3d\xba\xd7\x57\xec\xfa\x74\xae\xc1\x5c\x15\x0a\x25\xfc\x6a\xb2\xe0\x98\xc3\xbb\x06\x13\xaf\x2a\x18\x8a\xe6\xe4\xc0\x08\xf5\xa0\x2d\x39\x34\x20\xc7\x6d\xc6\x09\xbc\x6c\x33\xb4\x9a\x1b\xde\x5f\xa3\xdf\x23\xf0\x07\x0a\x3e\xcc\xa5\xfd\xcd\x70\xdf\xde\xe7\x16\x97\x37\x71\x20\x44\x0d\x37\x1f\x3d\x89\xe9\x20\x5d\x0a\xd2\xe4\x5b\xb4\x53\xd8\xf6\x08\x13\x80\xcb\x38\x9f\xc2\xd1\x30\x7e\x04\x4f\x69\x4c\x2f\xc7\xfb\x3d\x6a\x4d\xff\xe8\x61\xf2\x40\x5f\x48\xb5\xc3\x25\x9e\x37\xe0\x1a\xb1\xd3\xa4\x86\x2e\x36\x32\x13\x18\x00\x52\x38\x92\x58\x88\xb6\xf2\x47\xf7\x91\xac\xc2\xa3\x8d\xd3\xd8\x0c\x1e\xf5\xb8\xa3\x5a\xc7\xc6\xd9\x00\x33\xd8\x8e\x13\x47\xf1\x6a\xc8\x85\xc7\x56\xe4\x77\xc9\x12\x7c\x0c\xdd\x73\x58\x21\x86\x6e\xb6\x4b\x17\x8b\x41\x6f\xe6\xca\x2c\xa4\xc9\xdd\xc2\x62\x81\x16\x75\x8e\x8b\xfe\x6a\x79\x04\x36\x13\x8d\x5a\xdc\x1d\xcf\x8f\xff\x6d\x31\x21\x43\xbd\x3b\x8e\xaf\xc1\xc6\xd9\x41\x6c\x6b\x8f\x33\x88\xae\x0f\xdb\x8c\xae\x2c\xea\x40\xe4\x01\x79\x8f\x25\x1e\xe1\x7d\xc9\xe1\x6d\x6d\x71\xdf\xf6\x3a\x63\x99\x27\x9d\x67\xea\x91\x0e\x2f\x18\xfa\x4b\xaa\x5e\xff\xb8\x4b\xdd\x19\xd2\x83\x13\xdc\x9f\xf8\xdc\x49\x7a\x9b\x1e\x9f\xe3\xb1\xc5\xd1\xc7\x3c\x75\xbf\x71\x02\x2b\x6f\xac\xd8\xe0\x37\x68\x65\x4e\xfe\x8e\xeb\x86\xcf\x5d\x36\x24\x13\xb8\x36\xb9\x08\xe5\x23\xb8\xbd\xf3\x58\xcf\x13\x1e\x8a\x07\x09\xfe\xf2\x6d\xa9\x3c\x56\xca\x71\xe3\x9e\xaf\x0f\x46\xf7\x8e\x24\x00\x07\xbb\x52\xe5\x65\xe7\xc0\x94\x03\x51\x55\x66\x17\x1c\x6b\x78\x1b\xc4\xd7\x10\x61\xf0\x42\x0d\xbd\xe6\xf9\x82\xa8\x78\xb1\x5e\xdf\xc4\x1d\xfb\xa7\x2e\xde\xf4\xf7\x8b\xd0\xb4\x59\xa5\x72\x08\x6d\xb1\xd8\x04\xdf\x61\x06\x77\x4a\x80\x80\xe7\x97\xeb\xee\x25\xcf\x3c\x19\xa1\x4a\x0f\x6e\x20\x48\xf1\xc8\xde\x9e\xb9\xef\xc7\x2b\xdc\x41\xf3\xfe\xc7\xa5\x4b\x92\x10\x29\x57\x3f\xa6\x83\x0b\x94\xdd\xb5\xe8\x13\x3f\x2c\xba\xf7\xee\xe7\xa9\x2e\xe9\x06\x3b\x45\xbe\xab\x21\xbe\x76\x2f\x3b\x99\x86\xd5\x8f\xd0\x58\x73\xa7\x24\x5a\x07\xae\xcd\x4b\x10\x0e\x5e\x29\xad\x4c\x77\x93\x7a\x8e\x4d\x99\x4c\xe0\x39\x39\x1f\x95\x13\x33\xc2\x13\xbb\x81\x21\x1c\x0a\xc2\x1b\xbb\x4b\x2d\x1b\xa3\x74\xd8\x3d\x0c\x75\x24\x87\xaf\x31\x71\xe1\xa6\x6e\x24\xa3\xc7\x78\xfc\x07\xbe\x8b\x5b\xed\x54\xe1\x1f\xa7\xfb\x8d\x43\xfb\xfa\x33\xd7\x2d\x00\xa7\xad\x2f\xf9\x12\x33\x56\x71\x5a\x68\x3f\x82\x0e\x03\xf1\xed\x50\x97\x24\x8d\xe6\x27\xf0\xd3\x72\x09\xaf\xce\x88\xae\xb2\xd5\xdb\x95\xfa\x80\x67\x7b\x4a\x6a\x68\x22\xfc\x25\xc9\xcf\x07\xea\xff\x90\xc4\xe1\x1d\xd5\xd2\x45\x8a\x53\x38\x12\xda\xe8\x7d\x6d\x5a\x77\x8f\xec\xd1\xf8\xff\x05\x00\x00\xff\xff\x53\xa0\x2f\x67\x71\x2d\x00\x00") +var _configDefaultConfigYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x3a\x5d\x73\xdc\x38\x72\xef\xfc\x15\x1d\xcd\x5e\xc5\x5b\x35\x5f\xda\xad\xbd\xe4\x58\xa5\x07\x7d\xad\xad\x58\xf6\x2a\x9a\x71\x9c\x3c\xb9\x40\xa2\x39\xc4\x0e\x09\x70\x01\x50\xe3\xb1\xe3\xff\x9e\xea\x06\xf8\x31\x92\xbc\xf6\xdd\xc9\x55\x9b\xba\xd3\x8b\x86\x40\xa3\xd1\xe8\xef\x6e\x60\x02\xeb\x12\x41\x8b\x1a\xc1\x14\xe0\x4b\x04\x91\x7b\x75\x87\xe0\xd0\xde\xa1\x05\x29\xbc\xc8\x84\x43\xc8\x44\xbe\x45\x2d\x93\x09\x9c\xde\x09\x55\x89\xac\xea\xc7\x5c\x0a\x99\xa9\xbc\xcc\xa6\x90\x09\xb9\x41\x3b\xe5\x65\xce\x1b\x8b\x53\x90\x7b\x2d\x6a\x43\x93\x58\x09\xe7\x55\x3e\x85\xda\xe8\x8d\x91\x59\x72\x11\x91\x77\xeb\x93\xe4\xb3\xe4\xe4\xa6\x6e\x5a\xff\x25\x32\x2a\x93\x8b\x6a\x0a\xa5\xcf\x8d\x96\xc6\x4e\xc1\x55\xad\xad\xa7\xd0\x64\x6e\x0a\x1b\xab\x24\xea\x8d\xd2\x38\x85\x5a\xe8\x96\x20\xc5\xce\xcd\x32\xe1\xf3\x72\x0a\xdb\x36\x43\xab\xd1\xa3\x4b\xce\xc3\x66\x11\xdf\xef\x50\x85\x77\xa8\x3d\xec\xac\xf2\x68\x3b\x32\x9e\xb9\xef\xe7\x9f\x25\x6f\x33\xfd\xdb\x58\x35\x85\xad\x28\xb6\x22\xb9\xa4\x0d\xdf\xf2\x7e\x2e\x4d\x00\x66\x1d\xe7\xe8\x67\x65\x36\x49\x72\x6d\x36\x1b\xb4\x34\x37\x01\xfa\xad\xf4\x06\x2a\xbc\xc3\xca\xa5\x20\x31\x6b\x37\x53\x50\xba\x30\x53\x40\x6b\x8d\x4d\x00\xae\x69\x32\xe5\x41\x5e\xc4\xd8\x09\x97\x03\x6f\xc0\x97\xca\x41\x23\x7c\x39\x87\xab\x02\xb0\x6e\xfc\x7e\x1a\x26\x85\x45\x3e\xb9\x47\x4d\x80\xce\x4b\xb4\x76\x9e\x00\xfc\xd2\xfa\xa6\xf5\x3f\xab\x0a\x53\x38\x3a\x4a\x92\x15\x6b\x52\xa0\xe8\x85\x71\x7e\xcc\xc7\x9f\x5b\xad\xb1\x8a\xca\x46\x8b\x09\xe0\xb5\xa8\x3b\xde\x97\xc6\xf9\x84\x57\xde\x18\xeb\xa1\x75\x28\xa1\x30\x16\x5e\xac\xd7\x37\xa4\x13\x75\xab\x55\x2e\xbc\x32\x1a\x84\x96\x8c\x72\x87\x19\x48\xe1\xca\xcc\x08\x2b\x19\xe5\x7a\x7d\x43\xab\x53\xf8\xf7\xe5\x72\xf9\x18\xb6\xdb\x9b\xf3\x43\x64\xb4\xec\xf6\xe6\x3c\xac\xfa\xcb\xf2\x2f\x71\xd5\x2d\xfe\xd6\x2a\x4b\x12\x75\x2a\x07\xd1\xfa\x12\xb5\xef\xf6\x27\x44\xb4\x7f\x34\x9c\xd3\x9b\x2b\x07\xad\x23\xf6\x0b\x68\x84\x73\x3b\x13\xc8\x99\x10\x23\x69\x6b\xd2\xc2\x2d\x82\x6b\x2d\x12\x03\x1b\x6b\x1a\xb4\xd5\x1e\x2c\x3a\x6f\x55\xee\x41\xe4\x39\xba\x28\x05\xb2\x00\x5d\xa8\x0d\x14\xaa\x42\xc6\xf2\x0c\xe7\x9b\x39\xe4\x65\x6d\x24\xfc\x79\xb9\x84\x82\x59\x39\x0f\x60\xf3\x7d\x5d\x7d\xcf\x60\x67\x44\xeb\x69\xeb\xcb\x20\x00\xd2\x93\x37\x0e\x6d\x4a\x24\xd8\xe3\x38\x06\x70\x13\x29\x4c\x41\x64\xf9\xf1\x0f\x3f\x3e\x02\xfc\xc3\x23\xc0\x85\x31\x99\xb0\x81\x3b\x57\x3a\xaf\x5a\x89\x20\xe0\xe8\x5c\xe4\x25\xce\xce\x8d\xf6\xd6\x54\x29\x68\x33\x63\x0d\x3f\x0a\x72\x2b\x51\x48\xb4\xa0\x34\x3c\x47\xbf\xb8\x56\xce\xd3\x99\x1b\xa3\x1d\x3a\xc6\xc4\xdc\x08\xb6\x95\x8b\xbc\x24\x1e\x66\x7b\x50\xda\xa3\xad\x51\x2a\x61\xf7\xcc\x65\x95\xa3\x23\x8e\x5e\x28\x47\x86\x46\xb8\x79\xe3\x14\xbc\x6d\x31\x49\x6e\x6f\xce\xcf\x2b\x85\xda\x87\xa3\x93\x94\xa3\x70\x84\x94\x16\x1d\x6d\x16\x94\xf3\x34\x7c\x8f\x94\x2e\x1d\xa4\x7e\x6e\x51\x92\x9c\x45\xe5\x58\xc8\x67\xff\x8f\xa4\x1f\xa4\x17\x26\x83\xe2\xdf\x97\x33\x8f\xe6\x46\x6b\xcc\xf9\x20\x5e\xd5\x68\x5a\x4f\xb4\xae\xc3\xcf\x14\xfe\xbc\x74\x01\x8e\xdc\x60\x2d\xde\xab\xba\xad\x41\xb7\x75\x86\x96\x0d\x59\xd5\xe8\xc0\x97\xc2\x83\x00\x8b\xbf\xb5\xe8\x3c\xec\x54\x55\x41\x86\x60\xd1\x5b\x15\xed\xac\x10\xaa\x6a\x6d\x10\xda\x84\xd1\x43\x86\x7e\x87\xa8\x23\x18\x31\xb8\xaa\xcc\xce\x81\xd0\x80\xef\x1b\xa3\x03\xe3\xd9\x87\x9a\xa2\x00\xe7\x85\xf5\xcc\x55\x0f\x3f\x81\x43\xf2\xf3\x41\x67\xda\x86\x58\x75\x0c\xb5\xd2\xad\x27\x1e\xbd\x12\xef\x6f\x03\xd2\x14\x8e\x97\x9d\x13\x77\x79\x89\xb2\xad\x48\xfd\xdc\xe0\x00\x88\xc3\xaf\x38\x24\xdc\x0f\x34\xf3\x64\xd5\xad\xe8\x3c\xd8\x0e\x4c\x11\x9d\x9e\x6d\x35\x88\x31\x4e\x8f\xb6\x77\x20\xdd\xc2\x5b\x41\xa1\xe4\xd8\xf5\xcb\x6b\xa1\xf7\xe0\x85\xdb\xb2\x74\xbb\xd5\x64\x0f\x46\xe3\xe3\x38\xce\xcb\x56\x6f\xf9\x1c\x1d\x92\xca\xe8\x0d\x2d\xdf\x09\xe5\x7b\x2e\xb6\x8d\x14\x1e\x1d\x64\x58\x18\x4b\xa2\xb2\xdb\xa0\x82\xda\x48\x04\x89\x82\x75\xf0\xb5\x91\x78\xa3\xf4\xa6\x97\xef\x71\xfd\x38\x5a\x62\x4d\x5c\xcb\x1e\x5e\x58\x3f\xbd\x8f\x9b\x58\xf7\x00\xfb\x95\x56\xbe\xc7\xfe\x53\x9d\x24\x34\x98\x76\xea\x1f\xa3\x48\xc4\x7c\x75\xd1\xeb\x8a\x68\xbd\xa9\x05\xd9\x54\x55\xed\x61\x83\x9a\x38\x81\x8c\xf5\xea\x22\x04\x93\x88\xa2\xdf\xb5\x14\x74\x5a\xd4\xa0\x64\x85\x4c\x30\x9d\x00\x49\xa4\x42\x33\x58\x54\xe8\x29\xa8\xa8\x94\xae\x6c\x3d\x48\xb3\xd3\x41\x0d\x67\xc7\x50\xa3\xd0\xa4\xc0\x68\x91\xd4\x42\x9b\xde\x0a\x60\xd9\x4d\x86\x01\x50\x35\x7b\x20\x8f\xd5\x1e\x44\xe1\x31\xe8\x4e\xa1\xac\xf3\x2c\xd2\x03\xbb\x99\x1d\x47\xbb\x39\x65\xae\x84\xed\x0f\x0f\xe9\xed\x9e\x78\x2b\xd1\x63\xee\x61\x47\x36\x64\xd1\x99\xd6\xe6\x18\x42\xac\xe8\xf3\x08\x6f\x40\xf9\x40\xf3\x05\x16\x4a\x13\xf7\x6f\x7b\x58\x15\x4e\xcb\xfb\x04\x2f\xd0\x06\x35\x02\x73\x87\x96\x52\x1f\x17\x82\x79\x86\xa5\xb8\x53\x86\xa3\x6d\xbf\x9c\x64\xc3\xbe\xee\xe6\x8d\x1b\xb6\x9c\x77\xa3\x4d\xeb\x52\x60\x77\xc8\x8e\xf4\xf4\xd5\x00\x33\x65\x3f\x7e\xd6\x81\xde\x8a\xfa\x79\x96\xc2\x72\xde\x43\x5f\x28\xb7\x05\xd7\x88\x1c\x3f\xbb\x88\x40\x46\xab\x26\xf0\x33\xcb\x71\x37\xe3\xc4\x05\x7c\x4b\x67\x9d\x3f\x34\x3f\xb7\xd7\x39\xec\x94\x2f\x1f\xcf\x25\xde\xb0\x35\x04\xf3\xfb\xc9\x25\xc9\x5b\x63\xb7\x9d\x19\x53\x7a\xe2\x20\xb7\x48\x0a\x06\xb2\xb5\xc4\xcd\xc6\x1a\xf2\xb9\xf4\xb3\x53\xc9\x2e\xc3\x61\xf6\x2a\x07\x52\x59\xcc\xbd\xb1\x7b\xda\x80\x10\x5e\x28\x9b\xc2\x7c\x11\x5c\xec\x6c\x67\xec\x76\x26\x95\xfd\xab\x8e\xd1\x98\xaa\x62\xd5\xcd\x85\xce\xe9\x04\x6a\xa3\x45\x45\xfe\xe2\xc6\x54\x95\xd2\x9b\xe1\x08\x7f\x0d\x73\x50\x4b\xca\xca\x4c\xeb\x17\x68\x2d\x6b\x27\x65\x6e\xbd\x93\x88\x91\xe5\x01\xdb\x26\xb0\x42\xef\x83\x6d\x2b\x06\x5b\x06\x76\x58\x74\x6d\xe5\xa3\xa6\x39\xd2\x7a\xac\x24\x29\x14\xc1\x06\xac\x92\xdc\xa1\xd2\x9b\x2a\xd8\x1d\x63\x1b\xcc\x04\xdf\x63\xde\x7a\x63\x01\xdf\x2b\xcf\x51\xe0\xda\x6c\xee\x4b\x89\x96\xbc\x12\xef\x21\xdb\x47\x22\x39\x75\x60\xfe\x8c\x4e\x13\xd5\xbd\x3b\x54\xc4\xb5\x16\xaa\x5a\xa9\x0f\xe4\x6e\x97\xcb\xe5\x12\x26\x70\xbc\x84\x97\x67\x01\xe9\x6b\x63\xeb\x60\x73\x94\x25\xb2\x2e\x80\xc4\x8a\x32\x7e\x50\xde\xf1\x10\x9d\xa4\x17\x71\xa4\x3c\x50\xdd\x33\x79\x4d\x4c\x31\x0d\x9b\x96\x0c\x99\x47\x0c\x7e\x63\xcb\xba\x46\x71\x87\xbd\x7e\x14\xa2\x72\x18\xa8\xb8\x56\xb5\xf2\xc1\x7f\xf5\x01\x34\x37\x3a\x6f\xad\xa5\x7c\x87\xfc\x52\x65\x84\x74\x8b\xb6\xe1\xff\x21\x92\xdd\x08\x2b\xaa\x0a\xab\xb5\x15\xda\x15\x94\xfc\x87\x98\x36\x7b\xda\xbf\x64\x02\x5d\x4d\x46\x21\x58\x2e\x8c\x05\x2e\x39\x20\xd6\x1c\x8b\x17\x42\xcb\x0a\xad\x7b\xfa\xad\x93\x33\x53\xf9\x8b\xb3\x34\xa6\x29\x64\xd4\x41\x41\xfb\x12\x34\x26\x3f\x34\xf7\x88\xc9\xc5\xef\x39\x95\x91\x17\x5c\x48\x75\xc8\xce\x84\x43\x2e\x3a\xbc\xa1\x90\xcf\xaa\xd4\x95\x5a\xe0\x59\x80\xe4\xb5\xe9\x47\x07\x7a\x90\x33\x9d\xbe\x5d\x81\xc5\x8d\x32\x9a\x5d\x26\xfd\xe0\x60\xd4\xcd\x9d\x86\x4c\x6d\x8b\x7b\xb8\xba\x48\x00\x5e\xe2\xfe\x60\x7e\x85\xb9\x45\xdf\x81\xbd\xc4\x3d\xe7\x9d\x34\x16\x62\xda\x65\x28\xf6\xe2\xc9\x2d\x16\xea\xfd\x98\x54\xa5\x25\xbe\x47\x07\xcf\x48\xd9\xa7\xa1\xe6\x74\x53\x0e\x7f\x8e\xb2\xbc\x2b\x9a\x0f\xcb\x0e\xc8\x7e\x73\x7b\xdd\x95\x59\xb1\x9c\x74\x28\x6c\x5e\x8e\x3d\xe4\xed\x75\x0a\xa5\xf7\x4d\xba\x58\x8c\x52\xdf\x1f\x96\x9c\x2f\x3d\x37\x86\x0c\xf9\xbc\x32\xad\x64\xbd\x08\x96\xc8\x36\xd7\x09\x65\x9e\xf4\x13\x44\xff\x8d\x35\xbf\x62\xee\xfb\xe3\x77\x72\x14\x79\x6e\x5a\x4a\xe7\xc7\xb9\xb4\x0a\x11\x66\x02\xbf\xb0\x35\x89\x8a\x6b\xcc\xc6\x38\xa7\x38\x46\x8c\x81\x1f\x4f\x11\xa4\x72\x39\x85\x37\x94\x8c\xa7\xb0\xa6\x0e\xe7\xd5\x77\xca\x1a\x5d\xa3\xe6\x80\x39\xca\xe0\x87\xb2\xf4\x15\x55\xd6\x9d\x8a\x50\x01\xe0\xa0\x34\xe4\xcf\xb8\xbe\x0f\x05\x01\xba\x51\x62\x8f\x32\x72\x8e\x3d\x17\xaf\x08\x61\x73\xd6\x55\xe9\x63\x2e\x86\x38\xdd\xa9\xae\x72\x87\xaa\xcc\xea\xc8\xe9\x27\x85\x2f\xa5\x21\x52\x33\xf2\x77\xc1\x2d\xd3\x0a\xae\x71\xfa\x56\xc9\x48\xc2\xeb\x2e\x29\x89\x44\xd7\xcc\xe3\x98\x91\xdf\xcb\xe2\x62\x61\x42\x49\x2b\xd7\x5a\x12\x76\x25\xea\xc0\x36\xce\x5e\xba\x1a\x80\xf2\x45\x2d\x81\x6b\x1a\xca\xc5\x29\xb3\xa6\xda\x84\x93\x89\x3e\xcf\x70\x14\x27\x8d\x26\x89\x85\x92\x6d\x20\xe5\x03\x5a\x33\x0d\x45\x8b\xa8\x2a\xa8\xc5\x1e\xb2\xca\xe4\x5b\x22\x04\x89\x06\xa2\x8a\xb6\x09\x84\x0d\xb5\x47\x57\xfb\x65\x08\xe8\xc8\x2e\x95\x2b\x43\xf6\x37\xce\x25\xbb\xb2\x86\x59\x48\x94\x76\x25\x0d\xb7\x30\x6c\x50\x80\xfc\x5e\xcd\x46\x63\x4a\x2b\xae\x25\x0e\x2b\x37\xc6\x27\x29\xf1\x36\xfa\x50\x46\x92\x92\x2c\x94\x54\x7a\xd2\xf8\xc5\xe0\x86\xb0\x62\xaa\x3a\x2a\xa2\xb6\x0f\xa5\x15\xa9\xd7\x4b\x51\x6c\x45\xda\x57\x98\xbd\xaa\x30\xe8\xda\x34\x2a\xef\x45\xf9\x2d\xdc\x78\x6c\x61\xc1\x59\x6c\x3e\x7d\x03\x7f\xfd\x62\x7d\xce\x5d\xb6\x60\x41\xeb\xd6\x6a\xa0\x12\x8d\xdd\x83\xf3\xc2\x53\xed\x47\x91\x4d\x55\x68\xe7\xf0\xb6\x44\x0d\xa8\xc9\xc9\xca\x69\x97\x74\x0c\x4d\x17\x74\x43\x22\xf7\xe2\xe6\x9c\x51\x0e\x75\x95\x37\x50\x28\x2d\xbb\xa2\x89\x2b\x4d\x8b\xe0\x7c\x9b\x6f\x49\x23\x05\xfc\xd6\x62\x4b\x06\xca\xfb\x52\x86\x61\xad\xb1\x94\x8e\x68\x19\xcb\xc3\x98\xf4\x74\x49\x43\x80\x24\xbf\x64\x25\x25\x2c\xfb\x51\x27\xe1\xb6\xa7\x3b\xb6\x12\x42\xf3\x27\x0e\x52\xaa\x42\x7a\x5e\x0e\xd9\x56\xf9\xa0\x41\xc9\xdf\xc2\xa2\x0b\x1b\xb1\xdd\x84\x43\xff\xab\xeb\x9b\x98\x51\xdf\x7d\x69\x1c\x31\xab\x31\xd6\x0f\xfa\x36\x00\x1d\xec\x4c\x81\x9f\x8c\x60\x8d\x75\x53\x09\x8f\xbd\x43\x1b\x86\x52\xf8\x5f\x56\xb6\x56\x2b\xd2\x3c\x84\x13\xb8\x13\x5a\x55\x95\xe0\xe1\x0d\x7a\xd4\x77\x70\x02\xeb\x70\x34\x88\x19\x0e\x17\x19\x27\xf0\xf1\xe3\xfc\xb2\xff\xfe\xf4\x89\x01\x84\xdd\xb4\xe4\x4c\x1d\x9c\x74\x99\x13\x95\xbe\xb3\x59\x6c\x4b\x7c\xfc\x38\x3f\xe7\x5f\x9f\x3e\xc1\x6c\x46\xfc\x9d\x29\x49\xa3\x6b\xe1\xb6\x57\x32\x62\xa1\xe4\x93\xf1\xc7\xbc\xe8\xd3\xa7\x45\xe8\xd3\xce\x38\xa6\xcd\x2a\xb3\x09\xe4\x90\xec\xee\x43\xc6\x68\x1f\xda\x8c\x0c\x66\xb8\xcf\xf8\x79\x38\xd3\x7a\x86\x73\xa5\x69\x2b\xf9\xce\xc7\xd4\xe9\x5d\xc1\xa9\xff\x09\xfc\xcf\xe5\x8a\xe7\xc9\x0f\xbe\xf3\x66\x00\xe8\x11\xff\xf2\xfa\xdd\xe5\x7f\x5f\xad\xdf\xfd\x72\xfb\xee\xf2\xbf\xae\xce\xd7\x0c\xfe\xf1\xa3\x2a\x40\x23\xcc\xa9\x2a\x82\x25\xcc\xe2\xe9\x3e\x7e\x6c\xac\xd2\xbe\x80\xa3\xd8\x02\x79\x97\x13\xc0\x09\xfc\x49\x1e\x05\xe0\x1e\x70\x06\xa8\x65\xff\x15\xd1\x71\xe5\x44\x25\xd0\xef\x60\xac\xb1\xa6\xbc\xf4\x04\xfe\x34\x5f\x16\xf0\xfc\xec\x28\x2e\xfb\x7d\xcc\xa1\xbc\xfa\x02\x6a\x49\x65\xda\x18\x71\x58\xf5\x00\x33\x7f\xb2\xb5\x25\xc9\xcd\xd9\xea\x9f\xc6\xff\x07\x35\xfe\xc9\xbf\x64\x4a\x2f\x32\xe1\xca\xf0\x79\x73\xb6\x82\xd9\xeb\x07\x36\x19\xc6\xcd\x97\x6c\x28\x80\xe1\x97\x4c\xf2\xcb\xb6\x11\x10\x55\x21\x7b\x3d\x39\x4e\x9b\x46\x9f\x3c\x81\x81\x74\x68\x6b\xac\x4f\x48\x85\x37\xd9\x13\x98\x46\x87\x94\x1c\xc6\x80\xf5\xf7\xec\xe2\x9e\xef\xfc\x4a\x5f\x79\x75\x71\x20\x96\xe4\xb9\x55\xf2\x92\x2f\xaa\xd2\xbf\x4d\xd6\xdf\x3d\x2a\xe9\xef\xbe\x46\xce\xdf\x7d\x85\x94\x09\xa8\x97\xe0\xd7\xca\xfd\x3b\x98\x35\x08\x75\xa3\x9e\xc2\x1f\x06\x0a\xca\x77\x77\x9d\xbc\x9f\x3f\x85\xb8\x23\xd2\xc2\xa9\x0f\xd8\x63\xfd\xf6\xe2\x5e\x55\xad\xad\xff\xe9\x47\xff\xb0\x7e\x74\x71\x68\x5c\xab\xb3\xd3\xf5\xf9\x0b\x98\xcd\x7e\x35\xd9\x8c\x8b\x90\x07\x96\xd6\x83\xe8\xc0\xeb\xe3\x7b\xc3\x21\xc1\xf9\x92\x95\xf5\xe0\x31\x1f\xf9\x82\xe9\x7e\x85\x0d\xf6\x18\x29\x33\x99\x35\x68\x59\x1f\x9f\xc4\x20\x7b\xd4\x35\xd6\x9c\x44\x3c\x49\x72\x32\xa0\xf5\x75\x33\xa0\xfd\xf6\x36\xc9\x8d\x9b\x33\xe1\xf3\x12\x24\xba\xdc\xaa\x2c\xaa\xfd\x61\x6b\xbd\x2b\x2d\x4f\xdf\xae\x20\x40\x3f\xb8\x3e\xea\xf0\x3c\xa9\x81\xf7\xfb\x75\xda\x7f\xdf\xb0\x35\x17\xda\x7c\x63\x13\xec\x77\xb0\xdd\x3f\xbc\xdd\x8e\x0f\xf7\xa8\xd5\x4e\xe0\x3f\x4c\x16\xae\x40\x58\x0a\xb9\xd0\xdc\x33\x50\xbe\x44\xbe\xb0\xe2\x07\x06\x51\x32\xb5\xf8\x60\x74\x7f\xd1\x01\xaf\x69\xee\xd9\xe9\xed\xeb\xef\xe9\xc8\x07\x78\x52\x38\x8a\x56\x45\x96\x2d\xb1\x38\xea\xf6\xfa\x4f\xf2\x8b\x7f\xdf\x36\x8c\xe2\x70\x07\xf6\xb6\x47\xf7\x3a\x8c\x5d\xc7\xce\x35\x98\xab\x42\xa1\x84\x5f\x4d\x16\x1c\x73\x78\xe1\x60\xe2\xa5\x05\x43\xd1\x9c\x1c\x18\xa1\x1e\x34\x28\x87\x56\xe4\xb8\xe1\x38\x81\x97\xfd\x63\x97\xaf\xd2\xef\x11\xf8\x03\x05\x1f\xe6\xd2\xfe\x8e\xb8\x6f\xf4\x73\x8b\xcb\x9b\x38\x10\xa2\x86\x9b\x8f\x1e\xc7\x74\x90\x2e\x05\x69\xf2\x2d\xda\x83\x87\x38\x00\x97\x71\x3e\x85\xa3\x61\xfc\x08\x9e\xd2\x98\x5e\x8e\xf7\x7b\xd4\x9a\xfe\xd1\xc3\xe4\x81\xbe\x90\x6a\x87\xeb\x3c\x6f\xc0\x35\x62\xa7\x49\x0d\x5d\x6c\x64\x26\x30\x00\xa4\x70\x24\xb1\x10\x6d\xe5\x8f\xee\x23\x59\x85\xe7\x1b\xa7\xb1\x2d\x3c\xea\x76\x47\xb5\x8e\x8d\xb3\x01\x66\xb0\x1d\x27\x8e\xe2\x25\x91\x0b\xcf\xae\xc8\xef\x92\x25\xf8\x18\xba\xe7\xb0\x42\x0c\x7d\x6d\x97\x2e\x16\x83\xde\xcc\x95\x59\x48\x93\xbb\x85\xc5\x02\x2d\xea\x1c\x17\xfd\x25\xf3\x08\x6c\x26\x1a\xb5\xb8\x3b\x9e\x1f\xff\xdb\x62\x42\x86\x7a\x77\x1c\xde\x88\x1d\x64\x07\xb1\xc1\x3d\xce\x20\xba\x3e\x6c\x33\xba\xbc\xa8\x03\x91\x07\xe4\x3d\x96\x78\x84\x97\x26\x87\xf7\xb6\xc5\x7d\xdb\xeb\x8c\x65\x9e\x74\x9e\xa9\x47\x3a\xbc\x65\xe8\xaf\xab\x7a\xfd\xe3\x7e\x75\x67\x48\x0f\x4e\x70\x7f\xe2\x73\x27\xe9\x6d\x7a\x7c\x8e\xc7\x16\x47\x1f\xf3\xd4\xfd\xc6\x09\xac\xbc\xb1\x62\x83\xdf\xa0\x95\x39\xf9\x3b\x2e\x1e\x3e\x77\xed\x90\x4c\xe0\xda\xe4\x22\x94\x8f\xe0\xf6\xce\x63\x3d\x4f\x78\x28\x1e\x24\xf8\xcb\xb7\xa5\xf2\x58\x29\xc7\x8d\x7b\xbe\x3e\x18\xdd\x40\x92\x00\x1c\xec\x4a\x95\x97\x9d\x03\x53\x0e\x44\x55\x99\x5d\x70\xac\xe1\x95\x10\x5f\x48\x84\xc1\x0b\x35\xf4\x9a\xe7\x0b\xa2\xe2\xc5\x7a\x7d\x13\x77\xec\x1f\xbd\x78\xd3\xdf\x34\x42\xd3\x66\x95\xca\x21\xb4\xc5\x62\x13\x7c\x87\x19\xdc\x29\x01\x02\x9e\x5f\xae\xbb\x37\x3d\xf3\x64\x84\x2a\x3d\xb8\x81\x20\xc5\x23\x7b\x7b\xe6\xbe\x1f\xaf\x70\x07\xcd\xfb\x1f\x97\x2e\x49\x42\xa4\x5c\xfd\x98\x0e\x2e\x50\x76\x17\xa4\x4f\xfc\xc4\xe8\xde\x0b\xa0\xa7\xba\xae\x1b\xec\x14\xf9\xae\x86\xf8\xda\xbd\xf1\x64\x1a\x56\x3f\x42\x63\xcd\x9d\x92\x68\x1d\xb8\x36\x2f\x41\x38\x78\xa5\xb4\x32\xdd\x9d\xea\x39\x36\x65\x32\x81\xe7\xe4\x7c\x54\x4e\xcc\x08\x8f\xed\x06\x86\x70\x28\x08\xaf\xed\x2e\xb5\x6c\x8c\xd2\x61\xf7\x30\xd4\x91\x1c\xbe\xc6\xc4\x85\x3b\xbb\x91\x8c\x1e\xe3\xf1\x1f\xf8\x56\x6e\xb5\x53\x85\x7f\x9c\xee\x37\x0e\xed\xeb\xcf\x5c\xb7\x00\x9c\xb6\xbe\xe4\xeb\xcc\x58\xc5\x69\xa1\xfd\x08\x3a\x0c\xc4\x57\x44\x5d\x92\x34\x9a\x9f\xc0\x4f\xcb\x25\xbc\x3a\x23\xba\xca\x56\x6f\x57\xea\x03\x9e\xed\x29\xa9\xa1\x89\xf0\x97\x24\x3f\x1f\xa8\xff\x43\x12\x87\x17\x55\x4b\x17\x29\x4e\xe1\x48\x68\xa3\xf7\xb5\x69\xdd\x3d\xb2\x47\xe3\xff\x17\x00\x00\xff\xff\x5f\x13\xa0\xc8\x87\x2d\x00\x00") func configDefaultConfigYamlBytes() ([]byte, error) { return bindataRead( @@ -169,8 +169,8 @@ func configDefaultConfigYaml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "config/default-config.yaml", size: 11633, mode: os.FileMode(0644), modTime: time.Unix(1728510363, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x16, 0xbb, 0xcd, 0xc3, 0xda, 0x3e, 0x1e, 0x75, 0xa3, 0x87, 0xfb, 0xdf, 0x7, 0xd2, 0xca, 0x1, 0xc1, 0xac, 0xa9, 0xb6, 0x3d, 0xa8, 0x7b, 0xbb, 0x66, 0xae, 0xd2, 0xe3, 0x2e, 0xab, 0x4f, 0xf7}} + info := bindataFileInfo{name: "config/default-config.yaml", size: 11655, mode: os.FileMode(0644), modTime: time.Unix(1729212983, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x61, 0x5a, 0x7d, 0xb0, 0x9b, 0x9d, 0x13, 0x7, 0x49, 0xd0, 0x4c, 0xab, 0xc2, 0xe5, 0x37, 0xfa, 0x4a, 0x5a, 0x9a, 0x68, 0x89, 0x2b, 0x4b, 0x3e, 0xf3, 0x73, 0x35, 0x82, 0xe8, 0xf1, 0xbf, 0x3c}} return a, nil } @@ -194,7 +194,7 @@ func configHtcondorTemplateTxt() (*asset, error) { return a, nil } -var _configKubernetesTemplateYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x9c\x54\xcd\x8e\x9b\x3c\x14\xdd\xf3\x14\x57\x8c\xbe\x25\x81\x6c\xbe\x85\x77\x51\x32\x4a\x5b\x35\x4c\xd4\x8e\x66\x6f\xcc\x25\xb1\xe2\xbf\xda\x26\xa3\x28\xe2\xdd\x2b\x63\x68\x43\xfe\x16\xf5\xca\xbe\x07\x9f\x73\xee\xe5\x00\x35\xfc\x03\xad\xe3\x5a\x11\xa8\xa8\x67\xfb\xfc\x38\x4f\x0e\x5c\xd5\x04\xbe\xe9\x2a\x91\xe8\x69\x4d\x3d\x25\x09\xc0\xcb\x0b\xac\xde\xa0\x7c\x7b\x87\xe5\x97\x45\xb9\x7e\x85\x72\xb1\x79\x4d\x00\x14\x95\x48\xe0\x7c\x9e\xbd\x53\x77\xf8\x5a\x77\xdd\x50\x73\x86\xb2\x08\x94\xe3\xa9\xeb\x12\x67\x90\x11\x48\x00\x2a\xca\x0e\xba\x69\xbe\x73\xc9\x3d\x81\x22\x01\x60\x5a\x1a\x81\x9e\x6b\xe5\x08\xcc\x13\x00\x8f\xd2\x08\xea\x31\xa8\x03\xf4\x37\xfb\x1d\x80\x43\x7b\xe4\x0c\x17\x8c\xe9\x56\xf9\x72\x74\xf0\x73\x52\xee\x9d\x84\x65\xd1\x79\x6a\xfd\x56\x0b\xce\x4e\x04\x4a\x3c\xa2\x1d\x20\xa6\x95\xa7\x5c\xa1\x75\xbd\xa9\xb8\xb2\xa1\xa7\xa6\x55\x0a\x45\xf6\xa9\xed\x01\x6d\x36\xed\x70\x5c\x5c\xd2\x1d\x12\xd0\x7b\xd7\x06\xff\x15\xd7\xf9\x70\xad\xe6\xaa\xce\xac\xd6\x5e\xa0\x73\x24\xf4\xe1\xfc\xf5\xc5\x6d\x2b\xc4\x68\x6b\x21\x3e\xe9\xc9\x5d\x3c\x41\xed\xce\x91\x8b\x73\x30\x96\x46\x33\xe9\x75\xd9\xb6\xea\xa6\x96\x65\x4c\xab\x86\xef\x6e\x80\x1c\x3d\xcb\x23\x96\x4f\x7b\x8c\xc5\xd9\x49\x8a\x3b\x6c\x3e\x74\xbf\xba\x06\xee\x8f\xc5\xa2\xd3\xad\x65\x78\xd5\x40\x00\x7e\xb5\xe8\xfc\x4d\x1d\x80\x99\x36\xbc\x44\xde\x80\x42\x98\x2d\x4d\xeb\xa0\x80\xac\xeb\xce\xe7\xfe\x10\x36\x80\xc2\x21\x84\x5d\x3a\x2f\x0a\x99\x86\x1d\xaa\xa9\x72\x5c\x12\xa5\xb6\xa7\x0b\xbe\x1f\x54\xae\x2b\x28\x66\x03\xa5\xb1\x5c\xf9\x06\xd2\xff\x66\x45\xb3\x4e\x07\xb8\xa7\x13\x0e\xa3\xc0\xff\x9b\x27\xfc\x68\xf6\x28\xd1\x52\x91\x39\xaf\x6d\x1f\x81\x3f\x52\x2b\xee\x0e\xcf\xb4\x22\x3e\x15\x2b\x8a\xfb\x6a\x47\x2d\x5a\x89\x9b\x10\xe7\x9b\x2c\x4c\x42\x3a\xd8\x78\x90\xd2\x7e\x24\x81\x64\x4b\xfd\x9e\x40\xae\x8d\x1f\xde\xfc\x65\x00\xb2\x9a\xdb\xfc\x31\x81\x6b\xab\x78\xfd\xd1\x23\xa3\xa5\x98\xa2\x2c\x7a\x7f\xe2\xe2\x6f\x0c\x93\xe4\xb2\xdd\x7b\xdf\xe2\x23\xce\x58\xdf\x50\x33\x9d\xce\x64\x36\x83\xc6\x3f\x4d\xce\x84\xbf\xa3\xf3\xa8\xfc\x47\x2f\xbd\x14\x94\xcb\xa9\x16\x0b\xa5\xf8\x0f\x1a\xb9\xcc\x91\xc1\xef\x00\x00\x00\xff\xff\x38\xcd\x93\x4b\x5b\x05\x00\x00") +var _configKubernetesTemplateYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x9c\x54\xc9\x6e\xdb\x30\x10\xbd\xeb\x2b\x06\x0a\x7a\xd4\x92\x4b\x0f\xbc\x19\x49\x90\xa6\xa8\x95\xa0\x08\x72\xa7\xe8\x91\x4d\x98\x5b\xb8\x38\x30\x04\xfd\x7b\x41\x51\x6e\x2d\x6f\x87\xf2\x44\xce\x1b\xbe\xf7\x66\x38\x12\x35\xfc\x03\xad\xe3\x5a\x11\x68\xa9\x67\x9b\x6a\x77\x9f\x6d\xb9\x5a\x11\xf8\xa9\xdb\x4c\xa2\xa7\x2b\xea\x29\xc9\x00\xee\xee\xe0\xf1\x15\x9a\xd7\x77\x78\xf8\xb1\x68\x9e\x9f\xa0\x59\x2c\x9f\x32\x00\x45\x25\x12\xe8\xfb\xf2\x9d\xba\xed\xcb\x6a\x18\xa6\x98\x33\x94\x25\xa0\x39\x9c\x86\x21\x73\x06\x19\x81\x0c\xa0\xa5\x6c\xab\xbb\xee\x17\x97\xdc\x13\xa8\x33\x00\xa6\xa5\x11\xe8\xb9\x56\x8e\xc0\x7d\x06\xe0\x51\x1a\x41\x3d\x46\x75\x80\xf1\xe6\xb8\x03\x70\x68\x77\x9c\xe1\x82\x31\x1d\x94\x6f\x46\x07\x5d\x50\x0a\x45\xe1\xe8\x94\x63\xd1\x79\x6a\xfd\x9b\x16\x9c\xed\x09\x34\xb8\x43\x3b\x41\x4c\x2b\x4f\xb9\x42\xeb\x46\x2b\x69\x15\x53\x25\x13\xcf\x97\xb6\x5b\xb4\xc5\xbc\xae\xc3\xe2\x92\xae\x91\xc0\x67\xa0\xfb\x92\xeb\x4a\x6f\x5c\x28\xa2\xfd\xa2\xe5\xba\x4a\x04\xa4\xef\xcb\x97\x98\x76\x7e\xf1\x2d\x08\x71\xb0\xb5\x10\x5f\x74\xef\x8e\x32\xa8\x5d\x3b\x72\x74\x8e\xc6\xf2\x64\x26\x3f\x0d\xdb\xa0\xce\x62\x45\xc1\xb4\xea\xf8\xfa\x0c\xa8\xd0\xb3\x2a\x61\xd5\xac\xc6\x72\x4f\xa5\xb8\xc0\xe3\x63\xdd\x8f\xa7\xc0\xe5\x86\x58\x74\x3a\x58\x86\x27\xd6\x23\xf0\x19\xd0\xf9\xb3\x38\x00\x33\x21\x4e\x07\xef\x40\x21\x94\x0f\x26\x38\xa8\xa1\x18\x86\xbe\x1f\x0f\x71\x03\x28\x1c\x42\xdc\xe5\xf7\x75\x2d\xf3\xb8\x43\x35\x57\x4e\x4b\xa2\xd4\x76\x7f\xc4\xf7\x9b\xca\xe7\x16\xea\x72\xa2\x34\x96\x2b\xdf\x41\xfe\xad\xac\xbb\xe7\x7c\x82\x47\x3a\xe1\x30\x09\x7c\x5f\xde\xe0\x47\xb3\x41\x89\x96\x8a\xc2\x79\x6d\xc7\xc7\xff\x2b\xf5\xc8\xdd\xf6\x96\x56\xc2\xe7\x62\x75\x7d\x59\x6d\xa7\x45\x90\xb8\x8c\x53\x7d\x36\x05\xb3\xf1\x9c\x6c\x5c\x99\xcf\xb1\x25\x91\xe4\x8d\xfa\x0d\x81\x4a\x1b\x3f\xbd\xf9\xf1\xd3\x17\x2b\x6e\xab\xeb\x04\x2e\xb4\xe9\xfa\xb5\x94\x83\xa5\x34\x54\x45\xf2\x7e\xc3\xc5\xbf\x01\xcc\xb2\xe3\x72\x2f\x7d\x85\xd7\x38\x53\x7c\x49\xcd\xbc\x3b\xb3\xde\x4c\x1a\xff\xd5\x39\x13\xff\x86\xce\xa3\xf2\x1f\xa3\xf4\x83\xa0\x5c\xce\xb5\x58\x0c\xcd\xfe\x39\x66\xc7\xe0\x4f\x00\x00\x00\xff\xff\x8f\xdc\x15\xbd\x4a\x05\x00\x00") func configKubernetesTemplateYamlBytes() ([]byte, error) { return bindataRead( @@ -209,8 +209,8 @@ func configKubernetesTemplateYaml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "config/kubernetes-template.yaml", size: 1371, mode: os.FileMode(0644), modTime: time.Unix(1728510676, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x3a, 0x69, 0x1, 0x41, 0x70, 0xa9, 0x27, 0x6d, 0x4a, 0xec, 0xb6, 0x24, 0x14, 0x4d, 0xb8, 0x46, 0xdf, 0xfe, 0xff, 0x16, 0xd1, 0x6d, 0x48, 0xc8, 0xe, 0xea, 0x7a, 0xe6, 0x48, 0xff, 0xda, 0x42}} + info := bindataFileInfo{name: "config/kubernetes-template.yaml", size: 1354, mode: os.FileMode(0644), modTime: time.Unix(1729214525, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x7f, 0x59, 0x5d, 0x1c, 0xec, 0xeb, 0x76, 0x2c, 0x4e, 0xe3, 0xe4, 0x89, 0x72, 0xc4, 0xde, 0x87, 0x68, 0x66, 0x9b, 0xc7, 0x30, 0x87, 0xd8, 0x56, 0xc4, 0xd8, 0x38, 0xef, 0x82, 0xa0, 0x2b, 0x62}} return a, nil } diff --git a/config/kubernetes-executor-template.yaml b/config/kubernetes-executor-template.yaml index e428e10f6..e31f6317e 100644 --- a/config/kubernetes-executor-template.yaml +++ b/config/kubernetes-executor-template.yaml @@ -11,7 +11,7 @@ spec: template: spec: restartPolicy: Never - serviceAccountName: {{.ServiceAccount}} + serviceAccountName: funnel-sa containers: - name: funnel-worker-{{.TaskId}} image: {{.Image}} @@ -36,4 +36,4 @@ spec: volumes: - name: storage persistentVolumeClaim: - claimName: storage-pvc \ No newline at end of file + claimName: funnel-pvc \ No newline at end of file diff --git a/config/kubernetes-template.yaml b/config/kubernetes-template.yaml index 6363bc976..305ae577b 100644 --- a/config/kubernetes-template.yaml +++ b/config/kubernetes-template.yaml @@ -9,17 +9,17 @@ spec: completions: 1 template: spec: - serviceAccountName: {{.ServiceAccount}} + serviceAccountName: funnel-sa restartPolicy: Never containers: - name: funnel-worker-{{.TaskId}} - image: quay.io/ohsu-comp-bio/funnel:latest + image: quay.io/ohsu-comp-bio/funnel:{{.Image}} imagePullPolicy: Always args: - "worker" - "run" - "--config" - - "/etc/config/funnel-worker-config.yml" + - "/etc/config/funnel-worker.yaml" - "--taskID" - {{.TaskId}} resources: @@ -40,4 +40,4 @@ spec: name: funnel-config - name: funnel-storage-{{.TaskId}} persistentVolumeClaim: - claimName: storage-pvc \ No newline at end of file + claimName: funnel-pvc \ No newline at end of file diff --git a/deployments/kubernetes/README.md b/deployments/kubernetes/README.md index fa5dff009..e6f8df741 100644 --- a/deployments/kubernetes/README.md +++ b/deployments/kubernetes/README.md @@ -22,10 +22,18 @@ Kuberenetes Resources: kubectl apply -f funnel-service.yml ``` +## 2. Create Funnel config files + +> *[funnel-server.yaml](https://github.com/ohsu-comp-bio/funnel/blob/develop/deployments/kubernetes/funnel-server.yaml)* + +> *[funnel-worker.yaml](https://github.com/ohsu-comp-bio/funnel/blob/develop/deployments/kubernetes/funnel-worker.yaml)* + Get the clusterIP: ```sh -kubectl get services funnel --output=yaml | grep "clusterIP:" +export HOSTNAME=$(kubectl get services funnel --output=jsonpath='{.spec.clusterIP}') + +sed -i "s|\${HOSTNAME}|${HOSTNAME}|g" funnel-worker.yaml ``` Use this value to configure the server hostname of the worker config. @@ -43,7 +51,7 @@ We recommend setting `DisableJobCleanup` to `true` for debugging - otherwise fai ## 3. Create a ConfigMap ```sh -kubectl create configmap funnel-config --from-file=funnel-server-config.yml --from-file=funnel-worker-config.yml +kubectl create configmap funnel-config --from-file=funnel-server.yaml --from-file=funnel-worker.yaml ``` ## 4. Create a Service Account for Funnel diff --git a/deployments/kubernetes/funnel-deployment.yml b/deployments/kubernetes/funnel-deployment.yml index 8856f2dfe..84007dfdf 100644 --- a/deployments/kubernetes/funnel-deployment.yml +++ b/deployments/kubernetes/funnel-deployment.yml @@ -24,7 +24,7 @@ spec: - 'server' - 'run' - '--config' - - '/etc/config/funnel-server-config.yml' + - '/etc/config/funnel-server.yaml' resources: requests: cpu: 500m diff --git a/deployments/kubernetes/funnel-server-config.yml b/deployments/kubernetes/funnel-server-config.yml index 93b386700..cbd9695f4 100644 --- a/deployments/kubernetes/funnel-server-config.yml +++ b/deployments/kubernetes/funnel-server-config.yml @@ -12,48 +12,3 @@ Kubernetes: DisableReconciler: false ReconcileRate: 5m Namespace: default - Template: | - apiVersion: batch/v1 - kind: Job - metadata: - ## DO NOT CHANGE NAME - name: {{.TaskId}} - namespace: {{.Namespace}} - spec: - backoffLimit: 0 - completions: 1 - template: - spec: - restartPolicy: Never - serviceAccountName: funnel-sa - containers: - - name: {{printf "funnel-worker-%s" .TaskId}} - image: quay.io/ohsu-comp-bio/funnel:latest - imagePullPolicy: IfNotPresent - args: - - "worker" - - "run" - - "--config" - - "/etc/config/funnel-worker-config.yml" - - "--taskID" - - {{.TaskId}} - resources: - requests: - cpu: {{if ne .Cpus 0 -}}{{.Cpus}}{{ else }}{{"100m"}}{{end}} - memory: {{if ne .RamGb 0.0 -}}{{printf "%.0fG" .RamGb}}{{else}}{{"16M"}}{{end}} - ephemeral-storage: {{if ne .DiskGb 0.0 -}}{{printf "%.0fG" .DiskGb}}{{else}}{{"100M"}}{{end}} - volumeMounts: - - name: {{printf "funnel-storage-%s" .TaskId}} - mountPath: {{printf "/opt/funnel/funnel-work-dir/%s" .TaskId}} - - name: config-volume - mountPath: /etc/config - - securityContext: - privileged: true - - volumes: - - name: {{printf "funnel-storage-%s" .TaskId}} - emptyDir: {} - - name: config-volume - configMap: - name: funnel-config diff --git a/examples/internal/bundle.go b/examples/internal/bundle.go index 610bb33f2..69057bd4d 100644 --- a/examples/internal/bundle.go +++ b/examples/internal/bundle.go @@ -1,19 +1,24 @@ -// Package examples Code generated by go-bindata. (@generated) DO NOT EDIT. +// Code generated by go-bindata. DO NOT EDIT. // sources: -// examples/capture-stdout-stderr.json -// examples/google-storage.json -// examples/resource-request.json -// examples/input-content.json -// examples/hello-world.json -// examples/log-streaming.json -// examples/md5sum.json -// examples/s3.json -// examples/full-hello.json +// examples/capture-stdout-stderr.json (995B) +// examples/google-storage.json (462B) +// examples/resource-request.json (299B) +// examples/input-content.json (736B) +// examples/hello-world.json (187B) +// examples/safe-tag.json (233B) +// examples/log-streaming.json (304B) +// examples/md5sum.json (737B) +// examples/nextflow.json (551B) +// examples/s3.json (532B) +// examples/malicious-tag.json (283B) +// examples/full-hello.json (577B) + package examples import ( "bytes" "compress/gzip" + "crypto/sha256" "fmt" "io" "os" @@ -25,7 +30,7 @@ import ( func bindataRead(data []byte, name string) ([]byte, error) { gz, err := gzip.NewReader(bytes.NewBuffer(data)) if err != nil { - return nil, fmt.Errorf("read %q: %v", name, err) + return nil, fmt.Errorf("read %q: %w", name, err) } var buf bytes.Buffer @@ -33,7 +38,7 @@ func bindataRead(data []byte, name string) ([]byte, error) { clErr := gz.Close() if err != nil { - return nil, fmt.Errorf("read %q: %v", name, err) + return nil, fmt.Errorf("read %q: %w", name, err) } if clErr != nil { return nil, err @@ -43,8 +48,9 @@ func bindataRead(data []byte, name string) ([]byte, error) { } type asset struct { - bytes []byte - info os.FileInfo + bytes []byte + info os.FileInfo + digest [sha256.Size]byte } type bindataFileInfo struct { @@ -54,32 +60,21 @@ type bindataFileInfo struct { modTime time.Time } -// Name return file name func (fi bindataFileInfo) Name() string { return fi.name } - -// Size return file size func (fi bindataFileInfo) Size() int64 { return fi.size } - -// Mode return file mode func (fi bindataFileInfo) Mode() os.FileMode { return fi.mode } - -// ModTime return file modify time func (fi bindataFileInfo) ModTime() time.Time { return fi.modTime } - -// IsDir return file whether a directory func (fi bindataFileInfo) IsDir() bool { - return fi.mode&os.ModeDir != 0 + return false } - -// Sys return file is sys mode func (fi bindataFileInfo) Sys() interface{} { return nil } @@ -99,8 +94,8 @@ func examplesCaptureStdoutStderrJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "examples/capture-stdout-stderr.json", size: 995, mode: os.FileMode(420), modTime: time.Unix(1548721562, 0)} - a := &asset{bytes: bytes, info: info} + info := bindataFileInfo{name: "examples/capture-stdout-stderr.json", size: 995, mode: os.FileMode(0640), modTime: time.Unix(1706586712, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc1, 0x51, 0xcf, 0xff, 0x9e, 0x30, 0x6e, 0xd6, 0x85, 0x28, 0xb5, 0x98, 0x44, 0xa1, 0x6b, 0x5c, 0x28, 0xb4, 0xba, 0x3e, 0x40, 0x82, 0x3, 0x58, 0x1b, 0x89, 0xca, 0xf7, 0xc0, 0x29, 0x58, 0x96}} return a, nil } @@ -119,8 +114,8 @@ func examplesGoogleStorageJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "examples/google-storage.json", size: 462, mode: os.FileMode(420), modTime: time.Unix(1548721562, 0)} - a := &asset{bytes: bytes, info: info} + info := bindataFileInfo{name: "examples/google-storage.json", size: 462, mode: os.FileMode(0640), modTime: time.Unix(1706586712, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x3b, 0x28, 0x52, 0xb5, 0x1b, 0x70, 0x7b, 0xa1, 0x77, 0xb8, 0x17, 0x96, 0xc6, 0x3, 0xd8, 0xa0, 0x46, 0x5d, 0xe7, 0x44, 0x62, 0x78, 0xce, 0xec, 0x46, 0x20, 0x25, 0x74, 0xf3, 0xb6, 0xaf, 0x42}} return a, nil } @@ -139,8 +134,8 @@ func examplesResourceRequestJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "examples/resource-request.json", size: 299, mode: os.FileMode(420), modTime: time.Unix(1548721562, 0)} - a := &asset{bytes: bytes, info: info} + info := bindataFileInfo{name: "examples/resource-request.json", size: 299, mode: os.FileMode(0640), modTime: time.Unix(1706586712, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa5, 0x4a, 0x7f, 0x6d, 0xd4, 0x38, 0x22, 0xf1, 0x24, 0xb5, 0xc6, 0x61, 0xce, 0x9c, 0x40, 0xc9, 0x6, 0x44, 0xc8, 0x46, 0xd0, 0xd5, 0x88, 0x95, 0x76, 0x48, 0x8b, 0xa1, 0x33, 0x39, 0xbd, 0xc1}} return a, nil } @@ -159,8 +154,8 @@ func examplesInputContentJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "examples/input-content.json", size: 736, mode: os.FileMode(420), modTime: time.Unix(1548721562, 0)} - a := &asset{bytes: bytes, info: info} + info := bindataFileInfo{name: "examples/input-content.json", size: 736, mode: os.FileMode(0640), modTime: time.Unix(1706586712, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x49, 0x70, 0x12, 0xa9, 0x99, 0xea, 0x42, 0x7d, 0xd2, 0x79, 0x3c, 0xcc, 0xad, 0xf8, 0x22, 0xd7, 0xb8, 0xd8, 0xbb, 0xb6, 0x4, 0xbb, 0xa4, 0xf0, 0x5a, 0xa6, 0x1a, 0xfd, 0xa9, 0x28, 0xba, 0x20}} return a, nil } @@ -179,8 +174,28 @@ func examplesHelloWorldJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "examples/hello-world.json", size: 187, mode: os.FileMode(420), modTime: time.Unix(1548721562, 0)} - a := &asset{bytes: bytes, info: info} + info := bindataFileInfo{name: "examples/hello-world.json", size: 187, mode: os.FileMode(0640), modTime: time.Unix(1706586712, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x5f, 0x7f, 0x2d, 0x92, 0x82, 0x32, 0xc2, 0x3a, 0xc8, 0x1d, 0x60, 0x4d, 0xdc, 0x56, 0xfc, 0xf8, 0x75, 0x64, 0x9d, 0xa3, 0x9e, 0x45, 0x16, 0x97, 0xca, 0xc4, 0x1b, 0x81, 0xc3, 0x8c, 0xb6, 0x7}} + return a, nil +} + +var _examplesSafeTagJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x4c\x8d\x41\x8b\x83\x40\x0c\x46\xef\xf3\x2b\x3e\x72\x76\xf1\xee\x7d\x61\xef\xdb\x5b\xf1\x90\x6a\x1c\x0b\x8e\x23\x9a\x80\xa5\xf8\xdf\x4b\xa6\xa5\xed\x2d\xe1\xbd\x97\xdc\x03\x40\x33\x27\xa1\x06\xf4\xcf\x83\xe0\xc4\x11\xbf\x3b\xa7\x65\x12\xaa\x9c\x2a\xc7\x8d\x1a\xb8\x09\xd0\xc6\x83\xfc\x28\x47\xf7\x7d\xa6\x00\x1c\xc5\x93\x5d\x3a\xd3\xbc\xba\x7c\x2e\xf2\x33\x01\xe8\x9a\x38\x96\x0f\x76\xb1\x59\xad\xdc\x2d\xa0\xcb\x29\xf1\xdc\x7b\x41\xd2\x8d\x99\x2a\xd0\x9f\xf0\xa4\xe3\x8d\xda\xb7\xb5\x69\x9f\x4d\xbd\xaf\x7b\x56\xae\xb3\xe9\x62\x4a\xdf\x5c\xd6\xf5\xc3\x5f\x7b\xc1\x47\x00\xda\x70\x84\x47\x00\x00\x00\xff\xff\x12\x1d\xbf\x86\xe9\x00\x00\x00") + +func examplesSafeTagJsonBytes() ([]byte, error) { + return bindataRead( + _examplesSafeTagJson, + "examples/safe-tag.json", + ) +} + +func examplesSafeTagJson() (*asset, error) { + bytes, err := examplesSafeTagJsonBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "examples/safe-tag.json", size: 233, mode: os.FileMode(0644), modTime: time.Unix(1727826126, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xb, 0x31, 0x20, 0x2e, 0x11, 0x9a, 0x4a, 0xd1, 0x11, 0xca, 0x83, 0x8e, 0x9a, 0x8, 0xf3, 0x28, 0xa1, 0xd3, 0xeb, 0x6b, 0x12, 0x9b, 0x92, 0xd, 0x72, 0xce, 0xb0, 0x8a, 0x26, 0x65, 0x9e, 0xf}} return a, nil } @@ -199,8 +214,8 @@ func examplesLogStreamingJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "examples/log-streaming.json", size: 304, mode: os.FileMode(420), modTime: time.Unix(1548721562, 0)} - a := &asset{bytes: bytes, info: info} + info := bindataFileInfo{name: "examples/log-streaming.json", size: 304, mode: os.FileMode(0640), modTime: time.Unix(1706586712, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x8d, 0xe2, 0xc2, 0x8b, 0x68, 0xe0, 0xaf, 0x64, 0x8c, 0x5, 0xf0, 0xbf, 0x9a, 0xef, 0x1c, 0x4c, 0x87, 0xa1, 0xba, 0xf1, 0xbe, 0xae, 0xb8, 0xfc, 0x65, 0x86, 0xc9, 0xfe, 0x58, 0xe0, 0x46, 0xea}} return a, nil } @@ -219,12 +234,32 @@ func examplesMd5sumJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "examples/md5sum.json", size: 737, mode: os.FileMode(420), modTime: time.Unix(1548721562, 0)} - a := &asset{bytes: bytes, info: info} + info := bindataFileInfo{name: "examples/md5sum.json", size: 737, mode: os.FileMode(0644), modTime: time.Unix(1722035929, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x27, 0x60, 0x3a, 0x1, 0xdf, 0xa8, 0x51, 0x9e, 0xcd, 0xc7, 0x97, 0xce, 0x6d, 0xcf, 0x8a, 0x93, 0x72, 0xb2, 0xaf, 0x16, 0xb8, 0xdd, 0x25, 0xfd, 0xc2, 0x5, 0x98, 0xa, 0x14, 0x13, 0x2, 0xc7}} + return a, nil +} + +var _examplesNextflowJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x94\x90\x31\x6f\xe3\x30\x0c\x85\x77\xff\x0a\x82\x73\x6c\xef\x39\xdc\x94\xdc\x70\xc3\x5d\x83\x20\x4b\x51\x64\x50\x65\x39\x56\x62\x91\xaa\x44\xa5\x31\x8a\xfc\xf7\x42\x4a\x0b\x17\x45\x87\x76\xd1\x40\xbe\xf7\xf1\x3d\xbd\x54\x00\x48\xca\x19\x5c\x02\xfe\x37\x17\xe9\x47\x7e\x86\x95\x22\x15\x26\xd8\x99\x28\x11\x17\x59\xd2\x99\xa8\x83\xf5\x62\x99\xb2\x72\x9b\x08\x64\x30\xf0\xd9\x21\xd9\x01\xc2\x70\x36\xc1\xf6\xd3\xbc\x8f\xc9\x7b\x0e\x72\x83\x89\x3a\x44\x5c\x42\xbe\x0d\x80\x9b\xc0\x47\xa3\xe5\x63\x00\xac\x00\xae\x45\xca\x49\x7c\x92\xac\x7e\x28\xea\x9b\x07\x00\x53\x18\xb3\xa3\x15\xe7\x0b\xb4\x0c\xbd\x92\xa1\x4c\x1b\x7a\x23\xb5\xf3\x52\x26\x5f\x5a\xae\xff\x6e\xff\xac\x76\x77\xdb\x7b\x2c\x9b\xeb\xe2\x27\xe0\xc0\x2c\xdf\x60\x56\x00\xfb\x92\xdf\x5c\x8c\x4e\xc2\xe1\x8b\x06\xd6\xa9\x43\x31\x3f\x25\x35\x35\x96\x5b\x1e\x62\xaa\x35\x3b\x5f\x3f\x5a\x6e\xa9\xaf\x75\xf9\xd4\xf9\x9a\x66\xe7\x14\x75\x19\x85\x71\xc0\x05\x60\xad\xf3\xab\x3b\x28\xc1\x7e\xc1\x7b\x6d\xa8\xd7\xc7\xee\xd4\x8c\x8a\x0e\xcd\x26\xb0\x36\x31\x36\xa3\x4a\xa4\x87\x7f\x46\x0f\x8a\x6c\x74\xbf\xcf\x3d\x87\x13\x84\x44\x30\xdf\x6a\x9d\xb2\xd4\x50\x8f\xfb\xb9\x47\x75\xad\xaa\xd7\x00\x00\x00\xff\xff\xdf\x3a\x6a\xcf\x27\x02\x00\x00") + +func examplesNextflowJsonBytes() ([]byte, error) { + return bindataRead( + _examplesNextflowJson, + "examples/nextflow.json", + ) +} + +func examplesNextflowJson() (*asset, error) { + bytes, err := examplesNextflowJsonBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "examples/nextflow.json", size: 551, mode: os.FileMode(0644), modTime: time.Unix(1728514108, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x5, 0xe2, 0xb9, 0x78, 0xd2, 0xd3, 0x17, 0x6e, 0xe7, 0xe5, 0x4a, 0xf, 0xd3, 0x78, 0x15, 0x87, 0x85, 0xe6, 0x68, 0x53, 0xbd, 0x7e, 0xb9, 0x1b, 0x2f, 0xa8, 0xd9, 0xb3, 0x73, 0xd0, 0x9f, 0x49}} return a, nil } -var _examplesS3Json = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x64\x90\x4b\x6b\x7a\x31\x14\xc4\xf7\xf7\x53\x0c\x59\xfd\xff\xa0\xde\xd8\x5b\x17\x71\xdb\x6e\x0a\x5d\x69\xbb\x2a\x52\x8e\x37\xd1\x86\xe6\x45\x1e\x54\x10\xbf\x7b\x49\xa4\xda\xc7\x26\x04\x66\xce\xcc\xf9\x9d\x63\x07\x30\x47\x56\xb1\x25\xd8\x7a\xc0\x3a\xfb\x48\x7b\x05\x75\x20\x1b\x8c\x62\x93\xaa\x4b\x95\xc6\xa8\x43\xd6\xde\x55\xdb\x13\xa5\x77\x68\x17\x4a\x4e\x20\x27\xe1\x4b\x6e\xff\x91\x1c\xb6\x0a\x77\xc6\x17\x79\x09\x7a\x5e\x3d\xa6\xd9\x39\x46\x1d\xd4\x58\xb2\x8f\x89\x2d\xf1\xd2\x01\xc0\xb1\xbd\x00\xd3\x96\xf6\x6d\x85\xb2\x2d\x2e\x97\xe6\x6f\xc2\xe8\xad\x25\x27\xeb\x04\xb3\x72\x91\x8a\x65\x13\xb0\x3e\xdb\xd0\xef\xb4\x51\xb3\x83\x35\x6c\xd3\xcc\xa7\x0e\xd8\xb4\x9e\xf3\x6a\x7f\x4b\xbe\x30\x9b\x7e\xad\xf8\x45\x77\xef\x3f\x9c\xf1\x24\x41\x08\x65\x6b\xf4\x88\x5a\x84\x5d\xf4\x16\xdf\x0e\xf4\xef\x61\xb5\xc6\xce\x47\x0b\x21\x38\x24\x65\xfa\x7f\x8d\x2c\xd1\xd4\xa8\x34\x2c\xfb\x5e\xc7\x34\xad\xbe\xa9\x10\xbc\xbf\xe1\x5c\x0c\xf3\x41\x0c\xb7\x62\xe0\x9c\xcf\x17\xfc\xf5\x5c\xd2\x40\x2e\xf3\x81\xf2\x5b\x0d\xf8\xc9\x79\xc5\xec\x4e\xdd\x67\x00\x00\x00\xff\xff\x7c\xcd\x05\xad\xb9\x01\x00\x00") +var _examplesS3Json = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x64\x90\x4f\x8f\xd3\x30\x10\xc5\xef\xf9\x14\x23\x9f\x40\xda\xc4\x12\x2b\x2e\xb9\xa6\x15\x97\x8a\x03\x0b\x17\x50\x0f\x13\x67\x9a\x1a\xfc\x4f\x9e\x31\x0d\xaa\xfa\xdd\x51\x5c\x68\x61\x7b\xb1\x2c\xbd\x99\xf7\x7e\xf3\xce\x0d\x80\x0a\xe8\x49\xf5\xa0\x5e\x9e\xe1\x45\x62\xc6\x99\x80\x16\xf4\xc9\x91\x7a\x5a\xf5\x89\xd8\x64\x9b\xc4\xc6\xb0\x8e\x7d\x46\xfe\x01\x36\xa4\x22\x0c\x18\x26\x88\x45\xea\xdf\x60\x80\x91\x60\x70\xb1\x4c\x37\xa3\x2f\x9f\x76\xdc\x5d\x6d\x68\x21\x53\x24\x66\x56\x3d\x7c\x6b\x00\x00\xce\xf5\x05\x50\xd6\xe3\x5c\x11\xca\x58\x82\x94\x3a\x5f\x05\x13\xbd\xc7\x30\xad\x1b\xca\x4f\xef\xb9\x78\xf5\x04\x4a\x8b\x4f\x3a\x93\x23\x64\xea\xbe\x73\x0c\x6a\x5f\x17\x2e\x0d\xc0\xbe\x66\x5d\xf1\x1e\x83\xfe\x9e\x5a\xf5\x7b\xcc\xab\x0b\x37\xf1\x14\x5c\xc4\x09\x10\x52\x19\x9d\x35\x70\xb0\x8e\xe0\x90\xa3\x87\x7f\x4a\x7a\x33\x7c\x85\x61\xbb\xdb\x2d\x1f\xb6\x1f\xb7\xb0\xb1\x6c\xe2\x4f\xca\x30\x50\xe0\xc2\xb0\x41\xc1\x1e\x8e\x22\x89\x7b\xad\x33\xcd\x96\x25\xff\xea\x62\xa2\x30\xa1\x60\x87\x27\xd6\x82\xb3\x1e\x6d\xb4\xe1\x10\xb3\x47\xb1\x86\xf5\xdb\x3b\x55\xc9\x6e\xa5\xe1\xe7\x5e\x6b\x43\xce\x2d\x33\x05\x6a\x4d\xb5\x6f\xaf\x60\x6d\xe1\xf6\x44\x2c\xed\xbb\x3a\xf1\x47\xfc\xbf\x9b\x9b\x5f\x42\x39\xae\x86\x8f\xf5\xdd\xdb\x6b\x2e\xcd\xef\x00\x00\x00\xff\xff\x65\xd0\xc2\x9b\x14\x02\x00\x00") func examplesS3JsonBytes() ([]byte, error) { return bindataRead( @@ -239,8 +274,28 @@ func examplesS3Json() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "examples/s3.json", size: 441, mode: os.FileMode(420), modTime: time.Unix(1548721562, 0)} - a := &asset{bytes: bytes, info: info} + info := bindataFileInfo{name: "examples/s3.json", size: 532, mode: os.FileMode(0644), modTime: time.Unix(1729017342, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xce, 0xcf, 0xc, 0x0, 0xf8, 0xd5, 0x2b, 0x3c, 0x3f, 0x6e, 0x32, 0xcb, 0x99, 0x40, 0x9, 0x3b, 0x20, 0xd4, 0xde, 0x90, 0xd6, 0x4b, 0x53, 0x91, 0xd3, 0x71, 0x9b, 0x4f, 0x31, 0x3b, 0x70, 0x94}} + return a, nil +} + +var _examplesMaliciousTagJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x4c\x8e\x31\x4f\xc3\x30\x10\x46\x77\xff\x8a\x8f\x5b\xba\x14\x75\x2f\x33\x12\x0b\x1b\x1b\xea\x70\x38\x47\x12\x61\xe7\xa2\xe4\x4e\x0a\x42\xf9\xef\xe8\x4c\x81\x6e\xb6\xbe\xf7\x9e\xfd\x95\x00\x9a\xb8\x0a\x9d\x41\xcf\x5c\xc6\x3c\xaa\xaf\x78\xe1\x1e\x8f\x1b\xd7\xb9\x08\x1d\x03\x31\xee\x57\x3a\x23\x70\x80\x64\x9b\x8b\x8e\x76\x6f\xdc\x87\x37\xe9\x52\xb9\x3c\x40\xf2\xa0\x38\x0c\x9c\x3f\xa4\xbb\x3b\x34\x11\xa0\x95\xdf\xe5\x97\x8c\x33\x25\x60\x6f\x51\xd9\x24\xbb\xe9\x12\xe5\xd7\x06\xff\xf4\x01\x1a\x2b\xf7\xed\x4f\xfe\xe6\x93\xf9\xb5\x05\x50\xd6\x5a\x79\xea\xc2\xa0\x78\x8f\x8e\xa0\x27\xe1\x62\xc3\x27\x5d\xfe\xa8\xd5\x3a\x75\x0b\xff\xd4\xb1\xf1\x49\xdd\x66\x37\xba\xdd\x65\x59\xfe\xf7\xeb\xbd\xcd\x7b\x02\x2e\x69\x4f\xdf\x01\x00\x00\xff\xff\x13\x80\xdc\x46\x1b\x01\x00\x00") + +func examplesMaliciousTagJsonBytes() ([]byte, error) { + return bindataRead( + _examplesMaliciousTagJson, + "examples/malicious-tag.json", + ) +} + +func examplesMaliciousTagJson() (*asset, error) { + bytes, err := examplesMaliciousTagJsonBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "examples/malicious-tag.json", size: 283, mode: os.FileMode(0644), modTime: time.Unix(1727826052, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xce, 0xa3, 0x34, 0x4d, 0x66, 0x52, 0xc5, 0x96, 0x67, 0xd7, 0xea, 0xff, 0x5, 0x1c, 0x99, 0x98, 0xcb, 0xc3, 0xc5, 0xb5, 0xa8, 0x52, 0x91, 0x18, 0x5b, 0x89, 0xfb, 0xc8, 0xa5, 0x29, 0x67, 0x51}} return a, nil } @@ -259,8 +314,8 @@ func examplesFullHelloJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "examples/full-hello.json", size: 577, mode: os.FileMode(420), modTime: time.Unix(1548721562, 0)} - a := &asset{bytes: bytes, info: info} + info := bindataFileInfo{name: "examples/full-hello.json", size: 577, mode: os.FileMode(0640), modTime: time.Unix(1706586712, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa8, 0x44, 0x5c, 0x19, 0x7f, 0x64, 0x5f, 0xb2, 0x73, 0x48, 0x9f, 0x84, 0xc6, 0x2f, 0x14, 0x90, 0x37, 0xa0, 0x36, 0x7e, 0x8e, 0xff, 0x99, 0x31, 0xe7, 0xc4, 0xb9, 0xe, 0x7e, 0xdb, 0x3, 0x16}} return a, nil } @@ -268,8 +323,8 @@ func examplesFullHelloJson() (*asset, error) { // It returns an error if the asset could not be found or // could not be loaded. func Asset(name string) ([]byte, error) { - cannonicalName := strings.Replace(name, "\\", "/", -1) - if f, ok := _bindata[cannonicalName]; ok { + canonicalName := strings.Replace(name, "\\", "/", -1) + if f, ok := _bindata[canonicalName]; ok { a, err := f() if err != nil { return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err) @@ -279,6 +334,12 @@ func Asset(name string) ([]byte, error) { return nil, fmt.Errorf("Asset %s not found", name) } +// AssetString returns the asset contents as a string (instead of a []byte). +func AssetString(name string) (string, error) { + data, err := Asset(name) + return string(data), err +} + // MustAsset is like Asset but panics when Asset would return an error. // It simplifies safe initialization of global variables. func MustAsset(name string) []byte { @@ -290,12 +351,18 @@ func MustAsset(name string) []byte { return a } +// MustAssetString is like AssetString but panics when Asset would return an +// error. It simplifies safe initialization of global variables. +func MustAssetString(name string) string { + return string(MustAsset(name)) +} + // AssetInfo loads and returns the asset info for the given name. // It returns an error if the asset could not be found or // could not be loaded. func AssetInfo(name string) (os.FileInfo, error) { - cannonicalName := strings.Replace(name, "\\", "/", -1) - if f, ok := _bindata[cannonicalName]; ok { + canonicalName := strings.Replace(name, "\\", "/", -1) + if f, ok := _bindata[canonicalName]; ok { a, err := f() if err != nil { return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err) @@ -305,6 +372,33 @@ func AssetInfo(name string) (os.FileInfo, error) { return nil, fmt.Errorf("AssetInfo %s not found", name) } +// AssetDigest returns the digest of the file with the given name. It returns an +// error if the asset could not be found or the digest could not be loaded. +func AssetDigest(name string) ([sha256.Size]byte, error) { + canonicalName := strings.Replace(name, "\\", "/", -1) + if f, ok := _bindata[canonicalName]; ok { + a, err := f() + if err != nil { + return [sha256.Size]byte{}, fmt.Errorf("AssetDigest %s can't read by error: %v", name, err) + } + return a.digest, nil + } + return [sha256.Size]byte{}, fmt.Errorf("AssetDigest %s not found", name) +} + +// Digests returns a map of all known files and their checksums. +func Digests() (map[string][sha256.Size]byte, error) { + mp := make(map[string][sha256.Size]byte, len(_bindata)) + for name := range _bindata { + a, err := _bindata[name]() + if err != nil { + return nil, err + } + mp[name] = a.digest + } + return mp, nil +} + // AssetNames returns the names of the assets. func AssetNames() []string { names := make([]string, 0, len(_bindata)) @@ -321,12 +415,18 @@ var _bindata = map[string]func() (*asset, error){ "examples/resource-request.json": examplesResourceRequestJson, "examples/input-content.json": examplesInputContentJson, "examples/hello-world.json": examplesHelloWorldJson, + "examples/safe-tag.json": examplesSafeTagJson, "examples/log-streaming.json": examplesLogStreamingJson, "examples/md5sum.json": examplesMd5sumJson, + "examples/nextflow.json": examplesNextflowJson, "examples/s3.json": examplesS3Json, + "examples/malicious-tag.json": examplesMaliciousTagJson, "examples/full-hello.json": examplesFullHelloJson, } +// AssetDebug is true if the assets were built with the debug flag enabled. +const AssetDebug = false + // AssetDir returns the file names below a certain // directory embedded in the file by go-bindata. // For example if you run go-bindata on data/... and data contains the @@ -338,15 +438,15 @@ var _bindata = map[string]func() (*asset, error){ // a.png // b.png // -// then AssetDir("data") would return []string{"foo.txt", "img"} -// AssetDir("data/img") would return []string{"a.png", "b.png"} -// AssetDir("foo.txt") and AssetDir("notexist") would return an error +// then AssetDir("data") would return []string{"foo.txt", "img"}, +// AssetDir("data/img") would return []string{"a.png", "b.png"}, +// AssetDir("foo.txt") and AssetDir("notexist") would return an error, and // AssetDir("") will return []string{"data"}. func AssetDir(name string) ([]string, error) { node := _bintree if len(name) != 0 { - cannonicalName := strings.Replace(name, "\\", "/", -1) - pathList := strings.Split(cannonicalName, "/") + canonicalName := strings.Replace(name, "\\", "/", -1) + pathList := strings.Split(canonicalName, "/") for _, p := range pathList { node = node.Children[p] if node == nil { @@ -377,13 +477,16 @@ var _bintree = &bintree{nil, map[string]*bintree{ "hello-world.json": {examplesHelloWorldJson, map[string]*bintree{}}, "input-content.json": {examplesInputContentJson, map[string]*bintree{}}, "log-streaming.json": {examplesLogStreamingJson, map[string]*bintree{}}, + "malicious-tag.json": {examplesMaliciousTagJson, map[string]*bintree{}}, "md5sum.json": {examplesMd5sumJson, map[string]*bintree{}}, + "nextflow.json": {examplesNextflowJson, map[string]*bintree{}}, "resource-request.json": {examplesResourceRequestJson, map[string]*bintree{}}, "s3.json": {examplesS3Json, map[string]*bintree{}}, + "safe-tag.json": {examplesSafeTagJson, map[string]*bintree{}}, }}, }} -// RestoreAsset restores an asset under the given directory +// RestoreAsset restores an asset under the given directory. func RestoreAsset(dir, name string) error { data, err := Asset(name) if err != nil { @@ -401,14 +504,10 @@ func RestoreAsset(dir, name string) error { if err != nil { return err } - err = os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime()) - if err != nil { - return err - } - return nil + return os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime()) } -// RestoreAssets restores an asset under the given directory recursively +// RestoreAssets restores an asset under the given directory recursively. func RestoreAssets(dir, name string) error { children, err := AssetDir(name) // File @@ -426,6 +525,6 @@ func RestoreAssets(dir, name string) error { } func _filePath(dir, name string) string { - cannonicalName := strings.Replace(name, "\\", "/", -1) - return filepath.Join(append([]string{dir}, strings.Split(cannonicalName, "/")...)...) + canonicalName := strings.Replace(name, "\\", "/", -1) + return filepath.Join(append([]string{dir}, strings.Split(canonicalName, "/")...)...) } diff --git a/website/content/docs/compute/kubernetes.md b/website/content/docs/compute/kubernetes.md index 939d3d7c7..8753d7adc 100644 --- a/website/content/docs/compute/kubernetes.md +++ b/website/content/docs/compute/kubernetes.md @@ -12,51 +12,47 @@ This guide will take you through the process of setting up Funnel as a kubernete #### Create a Service: -*funnel-service.yml* +# Deploying -```yaml -{{< read-file "static/funnel-config-examples/kubernetes/funnel-service.yml" >}} -``` - -Deploy it: +## 1. Deploying with Helm ⚡️ ```sh -kubectl apply -f funnel-service.yml +helm repo add ohsu https://ohsu-comp-bio.github.io/helm-charts +helm repo update +helm upgrade --install ohsu funnel ``` -Get the clusterIP: +{{< details title="(Alternative) Deploying with `kubectl` ⚙️" >}} -```sh -kubectl get services funnel --output=yaml | grep "clusterIP:" -``` +### 1. Create a Service: -Use this value to configure the server hostname of the worker config. +Deploy it: -#### Create Funnel config files +```sh +kubectl apply -f funnel-service.yml +``` -*funnel-server-config.yml* +### 2. Create Funnel config files -```yaml -{{< read-file "static/funnel-config-examples/kubernetes/funnel-server-config.yml" >}} -``` +> *[funnel-server.yaml](https://github.com/ohsu-comp-bio/funnel/blob/develop/deployments/kubernetes/funnel-server.yaml)* -We recommend setting `DisableJobCleanup` to `true` for debugging - otherwise failed jobs will be cleanup up. +> *[funnel-worker.yaml](https://github.com/ohsu-comp-bio/funnel/blob/develop/deployments/kubernetes/funnel-worker.yaml)* -*funnel-worker-config.yml* +Get the clusterIP: -***Remember to modify the template below to have the actual server hostname.*** +```sh +export HOSTNAME=$(kubectl get services funnel --output=jsonpath='{.spec.clusterIP}') -```yaml -{{< read-file "static/funnel-config-examples/kubernetes/funnel-worker-config.yml" >}} +sed -i "s|\${HOSTNAME}|${HOSTNAME}|g" funnel-worker.yaml ``` -#### Create a ConfigMap +### 3. Create a ConfigMap ```sh -kubectl create configmap funnel-config --from-file=funnel-server-config.yml --from-file=funnel-worker-config.yml +kubectl create configmap funnel-config --from-file=funnel-server.yaml --from-file=funnel-worker.yaml ``` -#### Create a Service Account for Funnel +### 4. Create a Service Account for Funnel Define a Role and RoleBinding: @@ -80,7 +76,7 @@ kubectl create -f role.yml kubectl create -f role_binding.yml ``` -#### Create a Deployment +### 5. Create a Persistent Volume Claim *funnel-deployment.yml* @@ -88,13 +84,17 @@ kubectl create -f role_binding.yml {{< read-file "static/funnel-config-examples/kubernetes/funnel-deployment.yml" >}} ``` -Deploy it: +### 6. Create a Deployment + +> *[funnel-deployment.yml](https://github.com/ohsu-comp-bio/funnel/blob/develop/deployments/kubernetes/funnel-deployment.yml)* ```sh kubectl apply -f funnel-deployment.yml ``` -#### Proxy the Service for local testing +{{< /details >}} + +# 2. Proxy the Service for local testing ```sh kubectl port-forward service/funnel 8000:8000 diff --git a/website/layouts/shortcodes/details.html b/website/layouts/shortcodes/details.html new file mode 100644 index 000000000..15bf49fb6 --- /dev/null +++ b/website/layouts/shortcodes/details.html @@ -0,0 +1,4 @@ +
+ {{ .Get "title" | default "Click to expand" | markdownify }} +
{{ .Inner | markdownify }}
+
\ No newline at end of file diff --git a/worker/kubernetes.go b/worker/kubernetes.go index d8c40355c..c0960dded 100644 --- a/worker/kubernetes.go +++ b/worker/kubernetes.go @@ -83,7 +83,7 @@ func (kcmd KubernetesCommand) Run(ctx context.Context) error { _, err = client.Create(ctx, job, metav1.CreateOptions{}) if err != nil { - return fmt.Errorf("creating job: %v", err) + return fmt.Errorf("creating job in worker: %v", err) } // Wait until the job finishes