From 04fdbf152be585d69facb6fe241537fa1995412a Mon Sep 17 00:00:00 2001 From: Liam Beckman Date: Wed, 6 Nov 2024 09:19:35 -0800 Subject: [PATCH] Add Helm Charts --- compute/kubernetes/backend.go | 6 - config/internal/bundle.go | 18 +- config/kubernetes-executor-template.yaml | 25 +- config/kubernetes-template.yaml | 12 +- .../.cr-release-packages/funnel-0.1.9.tgz | Bin 0 -> 7263 bytes deployments/kubernetes/helm/funnel-0.1.2.tgz | Bin 0 -> 6775 bytes deployments/kubernetes/helm/funnel/Chart.yaml | 26 ++ .../helm/funnel/config/funnel-server.yaml | 90 ++++ .../helm/funnel/config/funnel-worker.yaml | 37 ++ deployments/kubernetes/helm/funnel/index.yaml | 3 + .../helm/funnel/templates/NOTES.txt | 5 + .../helm/funnel/templates/_helpers.tpl | 67 +++ .../helm/funnel/templates/configmap.yaml | 12 + .../helm/funnel/templates/deployment.yaml | 75 ++++ .../kubernetes/helm/funnel/templates/pv.yaml | 20 + .../kubernetes/helm/funnel/templates/pvc.yaml | 21 + .../helm/funnel/templates/role.yaml | 17 + .../helm/funnel/templates/rolebinding.yaml | 14 + .../helm/funnel/templates/service.yaml | 18 + .../helm/funnel/templates/serviceaccount.yaml | 10 + .../helm/funnel/templates/storageclass.yaml | 17 + .../templates/tests/test-connection.yaml | 15 + .../kubernetes/helm/funnel/values.yaml | 425 ++++++++++++++++++ deployments/kubernetes/helm/local.conf | 2 + worker/kubernetes.go | 1 + 25 files changed, 902 insertions(+), 34 deletions(-) create mode 100644 deployments/kubernetes/helm/.cr-release-packages/funnel-0.1.9.tgz create mode 100644 deployments/kubernetes/helm/funnel-0.1.2.tgz create mode 100644 deployments/kubernetes/helm/funnel/Chart.yaml create mode 100644 deployments/kubernetes/helm/funnel/config/funnel-server.yaml create mode 100644 deployments/kubernetes/helm/funnel/config/funnel-worker.yaml create mode 100644 deployments/kubernetes/helm/funnel/index.yaml create mode 100644 deployments/kubernetes/helm/funnel/templates/NOTES.txt create mode 100644 deployments/kubernetes/helm/funnel/templates/_helpers.tpl create mode 100644 deployments/kubernetes/helm/funnel/templates/configmap.yaml create mode 100644 deployments/kubernetes/helm/funnel/templates/deployment.yaml create mode 100644 deployments/kubernetes/helm/funnel/templates/pv.yaml create mode 100644 deployments/kubernetes/helm/funnel/templates/pvc.yaml create mode 100644 deployments/kubernetes/helm/funnel/templates/role.yaml create mode 100644 deployments/kubernetes/helm/funnel/templates/rolebinding.yaml create mode 100644 deployments/kubernetes/helm/funnel/templates/service.yaml create mode 100644 deployments/kubernetes/helm/funnel/templates/serviceaccount.yaml create mode 100644 deployments/kubernetes/helm/funnel/templates/storageclass.yaml create mode 100644 deployments/kubernetes/helm/funnel/templates/tests/test-connection.yaml create mode 100644 deployments/kubernetes/helm/funnel/values.yaml create mode 100644 deployments/kubernetes/helm/local.conf diff --git a/compute/kubernetes/backend.go b/compute/kubernetes/backend.go index addd60363..6359ddf76 100644 --- a/compute/kubernetes/backend.go +++ b/compute/kubernetes/backend.go @@ -147,17 +147,11 @@ 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 { diff --git a/config/internal/bundle.go b/config/internal/bundle.go index 5ae7cb96e..2cf51a078 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.135kB) +// config/kubernetes-executor-template.yaml (1.521kB) // config/default-config.yaml (11.655kB) // config/htcondor-template.txt (505B) -// config/kubernetes-template.yaml (1.354kB) +// config/kubernetes-template.yaml (1.785kB) 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\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") +var _configKubernetesExecutorTemplateYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x84\x54\x4d\x8f\xdb\x36\x10\xbd\xfb\x57\x0c\xe4\x14\xbd\x44\x5a\xed\xa5\x07\x01\x3d\x2c\xbc\xdb\x8d\xd3\xac\xb3\xe8\x2e\xd2\x43\xd1\x03\x45\x8d\x24\xd6\xfc\x2a\x87\x74\x62\x18\xfe\xef\x05\x45\x59\x96\x1d\x74\xa3\xd3\x70\xe6\xf1\xcd\xbc\x99\xa1\x98\x15\x5f\xd0\x91\x30\xba\x82\x9a\x79\xde\xdf\xec\x6e\x17\x5b\xa1\x9b\x0a\x3e\x9a\x7a\xa1\xd0\xb3\x86\x79\x56\x2d\x00\x34\x53\x58\xc1\xe1\x50\xbc\x32\xda\xae\x9b\xe3\x31\x3f\x1c\x8a\x8f\xa6\x8e\xe6\x18\x26\xcb\x78\xc2\x6c\x4e\xa7\x21\x26\x59\x8d\x92\x22\x09\xc0\x3f\xa6\xce\xdf\xa4\x22\x8b\xbc\x82\x05\x40\xcd\xf8\xd6\xb4\xed\x27\xa1\x84\xaf\xa0\x5c\x00\x70\xa3\xac\x44\x2f\x8c\xa6\x0a\x6e\x17\x00\x1e\x95\x95\xcc\x63\xa2\x1e\x6e\x2e\x06\x13\x60\x09\x0f\x9a\x82\x43\x02\xdf\x33\x0f\xbe\x47\xf8\x6a\xdc\x16\x1d\x58\xd3\x80\x0b\x9a\xc0\xe8\xc1\x4d\x4c\x21\x68\xd3\x20\x30\x4a\x0e\x74\xbb\x84\x1b\xb9\x58\xdb\x0a\x2d\xfc\xbe\x1a\xcf\x10\x63\x77\xdf\x39\x01\x1c\xfe\x1b\x84\xc3\xe6\x3e\x38\xa1\xbb\x17\xde\x63\x13\xa4\xd0\xdd\xba\xd3\x66\x72\x3f\x7c\x43\x1e\xa2\x88\xf9\xcd\x3c\x35\xe9\x05\x25\x72\x6f\xdc\x3c\x14\x3f\x15\x67\xf3\x69\xd6\xc6\xf9\xc7\xac\xad\xa0\x0d\x5a\xa3\x8c\xba\x9f\x22\x76\x10\xf2\x5b\xf2\x9d\xf5\xfc\x4c\x29\xcd\x05\x85\x37\xd6\x48\xd3\xed\x7f\xc7\x7d\x05\xd9\x36\xd4\xe8\x34\x7a\xa4\x42\x98\x9b\xde\x90\x8f\xd3\xca\xce\x0d\x3d\xf7\xeb\xd4\x6a\x87\xe4\x99\xf3\xcf\x46\x0a\xbe\xaf\x60\x83\x3b\x74\x63\x28\xa6\x16\x1c\xef\x38\x37\x41\xfb\xcd\x30\xf7\x54\x69\x4e\x6c\xc4\x70\xa3\x3d\x13\x1a\x1d\x0d\x63\x4f\xdd\xd0\x73\x68\x1a\x5c\x3e\x5b\x98\x49\x80\x50\xac\x4b\xbb\xb4\x8e\xd6\x75\xe4\x39\x48\x79\xaa\xeb\x4e\x7e\x65\x7b\x9a\xe2\xdc\x28\xc5\xe2\xa2\xff\x95\xdd\xd4\x42\xdf\x50\x9f\xbd\x87\x2c\xe7\xd9\xdf\x13\x84\xb9\x8e\x06\xee\x55\xc2\xce\xd8\x63\x49\x42\x77\xf7\xc2\x0d\x80\x3f\x8d\xdb\x36\xc2\xcd\x00\x0e\xc9\x04\xc7\x91\xae\xf7\x03\xc9\x5f\xcd\x90\xdb\x10\x49\x44\x0b\x1a\xa1\x58\xd9\x40\x50\x42\x7e\x3c\xc6\xc4\x36\x50\x34\x00\x25\x21\x44\x2b\xbb\x2d\x4b\x95\x45\x0b\x2f\x0a\x1a\xb6\x04\x95\x71\xfb\x19\xd7\x1f\x4c\x3d\xd6\x50\x16\x23\x9d\x75\x42\xfb\x16\xb2\x9f\x8a\xb2\x7d\xcc\xc6\xf0\x40\x25\x09\x13\xf9\x2f\x4f\xff\xc3\x8d\xb6\x47\x85\x8e\xc9\x9c\xbc\x71\x63\xd3\xc7\x34\xf7\x82\xb6\x6f\xe5\x49\xf1\xcb\x44\x65\x39\xcf\x34\x3d\x5a\x80\x9d\x91\x41\xe1\x53\xdc\x97\xa9\x4f\xd1\xbf\x5c\x2e\xe1\xfe\x33\x6c\x3e\xbf\xc2\xea\xc3\xdd\xe6\xf1\x01\x5e\x3f\xac\x5f\x66\x80\xc3\xc1\x31\xdd\x21\xbc\x13\xcd\xb7\xf7\xf0\x4e\x78\x54\x50\xfd\x0a\xc5\x97\x81\x90\x26\x3d\xcb\xd9\x82\x8d\x5a\x60\x16\x02\x50\x31\xf7\x33\xf3\x7d\x94\x38\xf0\x14\xab\xd3\x8e\x46\xf7\x05\x13\x00\x85\x7a\x02\x4f\x0b\xfa\xe3\x8b\xdf\x49\x4f\xc2\xcf\x8f\x60\x79\x5d\xe5\xec\xb2\x8d\x3f\x6d\xf2\xa8\x7d\x52\xb7\x92\x4c\xa8\xea\xa2\x2c\x1e\x5d\x17\x2f\xce\xee\x38\xfc\x17\x00\x00\xff\xff\x52\x41\x10\x0e\xf1\x05\x00\x00") func configKubernetesExecutorTemplateYamlBytes() ([]byte, error) { return bindataRead( @@ -149,8 +149,8 @@ func configKubernetesExecutorTemplateYaml() (*asset, error) { return nil, err } - 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}} + info := bindataFileInfo{name: "config/kubernetes-executor-template.yaml", size: 1521, mode: os.FileMode(0644), modTime: time.Unix(1730912888, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x59, 0x92, 0x28, 0x98, 0xde, 0x1c, 0xe2, 0x20, 0xc2, 0x47, 0x66, 0x4c, 0x5d, 0x7e, 0xfd, 0x12, 0x52, 0x5c, 0x93, 0x94, 0x63, 0xa6, 0x33, 0x67, 0xe6, 0x7a, 0x21, 0x75, 0x90, 0xa, 0xe3, 0xb9}} return a, nil } @@ -169,7 +169,7 @@ func configDefaultConfigYaml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "config/default-config.yaml", size: 11655, mode: os.FileMode(0644), modTime: time.Unix(1729212983, 0)} + info := bindataFileInfo{name: "config/default-config.yaml", size: 11655, mode: os.FileMode(0644), modTime: time.Unix(1729641602, 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\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") +var _configKubernetesTemplateYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x9c\x55\x4d\x93\xa3\x36\x10\xbd\xf3\x2b\xba\x70\xa5\x72\xc2\x30\x97\x1c\xb8\xa4\x5c\xe3\xc9\x64\x93\xb5\x67\x2a\x33\xb5\x77\x21\x1a\xa3\xb2\xbe\x56\x1f\xde\x50\x2e\xff\xf7\x94\x10\xac\x01\x7b\xe6\x10\x5d\x10\xdd\xad\xf7\xba\x5f\xb7\x80\x68\xf6\x0d\x8d\x65\x4a\x96\x50\x11\x47\xdb\xfc\xf4\x90\x1c\x99\xac\x4b\xf8\x4b\x55\x89\x40\x47\x6a\xe2\x48\x99\x00\xac\x56\xb0\x7d\x81\xfd\xcb\x3b\x3c\xfe\xb9\xd9\x3f\x3f\xc1\x7e\xb3\x7b\x4a\x00\x24\x11\x58\xc2\xf9\xbc\x7e\x27\xf6\xf8\xa5\xbe\x5c\x06\x9b\xd5\x84\x46\xc7\x7e\x7c\xbb\x5c\x12\xab\x91\x96\x90\x00\x54\x84\x1e\x55\xd3\x7c\x65\x82\xb9\x12\x8a\x04\x80\x2a\xa1\x39\x3a\xa6\xa4\x2d\xe1\x21\x01\x70\x28\x34\x27\x0e\x03\x3b\x40\x7f\xb2\xdf\x01\x58\x34\x27\x46\x71\x43\xa9\xf2\xd2\xed\xfb\x0c\x1a\x2f\x25\xf2\xcc\x92\x21\x06\x86\xe7\x0a\x9e\xa4\xf5\x06\x2d\xb8\x96\x38\x70\x2d\xc2\x0f\x65\x8e\x68\x40\xab\x1a\x8c\x97\x16\x94\xec\xcd\x96\x08\x04\xa9\x6a\x04\x62\xa3\x01\xcd\x29\xc6\x0d\x58\xa4\x69\x98\x64\xae\x1b\xf3\x80\xe0\xdb\xdc\x18\x01\x0c\x7e\xf7\xcc\x60\xbd\xf5\x86\xc9\xc3\x1b\x6d\xb1\xf6\x9c\xc9\xc3\x97\x83\x54\x3f\xcd\x4f\xff\x22\xf5\xa1\xde\xe9\xc9\x0c\x38\xa9\x90\xbf\x21\x47\xea\x94\x99\xba\xc2\x12\xa1\x49\x5f\x43\x84\x5d\xba\x00\x88\xd6\xa3\x0e\xa1\xee\x5d\x88\xed\x0b\xf9\x23\xda\xae\xf5\xfc\x6a\x23\xcd\x0c\xc2\x29\xad\xb8\x3a\x74\x7f\x63\x57\x42\x7a\xf4\x15\x1a\x89\x0e\xed\x9a\xa9\xbc\x55\xd6\x85\xae\xa6\x57\x41\xaf\x7a\x25\xc9\x58\xb5\x75\xc4\xb8\x57\xc5\x19\xed\x4a\xd8\xe3\x09\xcd\xe0\xa2\x4a\x3a\xc2\x24\x1a\x5b\x42\x72\xad\x55\x4e\x5b\x17\xdb\x92\xcd\x47\x69\x5c\x2b\x78\x7f\xd9\xbe\x94\xf0\xd6\x2a\xcf\x6b\x70\x2d\xb3\x50\x61\xc0\x6d\xd8\xc1\x1b\x52\x71\xfc\x7d\x12\xce\x04\x39\x60\x09\xdf\x3d\xe9\x42\xfa\xaa\xb5\x3e\x0b\x03\x96\x55\x4c\xe5\x91\xaf\xac\xf1\x84\x5c\x69\x81\xd2\x2d\x4f\xbe\x7a\xce\xc7\x32\x36\xfc\x07\xe9\xec\x24\x82\x98\xc3\x42\xfc\x0c\xd2\x98\x7c\xba\x34\x1b\x2f\x6f\x6c\x59\x16\xb3\xbe\x71\xe4\xe8\x68\x1e\x7d\xf9\x4c\x93\x75\x47\x04\xbf\x83\xe3\x82\x4e\xdb\xa5\xe3\xbe\x80\x06\xad\xf2\x86\xe2\xcd\xdc\x84\x59\x45\xeb\xee\xcc\x13\xd5\x3e\x5c\x60\xd6\x80\x44\x58\x3f\x6a\x6f\xa1\x80\xec\x72\x39\x9f\xfb\x97\xb0\x01\xe4\x16\x21\xec\xd2\x87\xa2\x10\x69\xd8\xa1\x9c\x33\xc7\x25\x50\x28\xd3\x4d\xf0\xfe\x21\xe2\xb9\x82\x62\x3d\x40\x6a\xc3\xa4\x6b\x20\xfd\x65\x5d\x34\xcf\xe9\xe0\xee\xe1\xb8\xc5\x48\xf0\xdb\xee\x13\x7c\xd4\x2d\x0a\x34\x84\x67\xd6\x29\xd3\x77\xff\x27\xd5\x96\xd9\xe3\x67\x5c\xd1\x3f\x27\x2b\x8a\xfb\x6c\x27\xc5\xbd\xc0\x5d\xf8\xf0\x2c\x24\x5b\x2d\x07\x7a\x48\xe4\x83\x89\x0e\x07\x00\x44\x00\x7a\x25\xae\x2d\x21\x57\xda\x0d\x7d\x9f\xb6\x3f\xab\x99\xc9\x3f\x83\xb0\xbe\x8a\x00\x1f\x05\x8d\x69\xc5\xd1\xca\x62\x05\xcb\x0f\xcb\x24\x8f\xeb\x18\x8e\x37\x3b\x1e\xb9\x77\x77\x3f\xc2\x8c\xf6\x1d\xd1\x73\x8d\x66\xfa\x0c\x1c\xff\x4b\xbf\x50\xb8\x0e\xbf\x2e\xeb\x50\xba\x6f\x3d\xfd\x23\x27\x4c\x94\xb3\x10\x00\x1a\x8c\xb3\x5f\x84\x3e\x51\xf8\x2f\x00\x00\xff\xff\x71\xbc\x58\x2c\xf9\x06\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: 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}} + info := bindataFileInfo{name: "config/kubernetes-template.yaml", size: 1785, mode: os.FileMode(0644), modTime: time.Unix(1730912881, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1f, 0x41, 0xd9, 0xeb, 0x65, 0x4e, 0x19, 0x40, 0xd3, 0x9b, 0xbe, 0x1, 0xe, 0xb5, 0xa8, 0x2f, 0xaa, 0x21, 0xd7, 0x2a, 0x40, 0xd6, 0x36, 0x60, 0x2c, 0xe2, 0x5c, 0x9d, 0x5a, 0x9d, 0xd1, 0x2}} return a, nil } diff --git a/config/kubernetes-executor-template.yaml b/config/kubernetes-executor-template.yaml index ab41fe16b..a8ba9d1e6 100644 --- a/config/kubernetes-executor-template.yaml +++ b/config/kubernetes-executor-template.yaml @@ -14,8 +14,7 @@ spec: serviceAccountName: funnel-sa containers: - name: funnel-worker-{{.TaskId}} - # TODO: Should this be configurable? - image: quay.io/ohsu-comp-bio/funnel:development + image: {{.Image}} imagePullPolicy: Always command: ["/bin/sh", "-c"] args: {{.Command}} @@ -26,15 +25,15 @@ spec: 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: - ### DO NOT CHANGE THIS - {{range $idx, $item := .Volumes}} - - name: storage - mountPath: {{$item.ContainerPath}} - subPath: {{$.TaskId}}{{$item.ContainerPath}} - {{end}} + # volumeMounts: + # ### DO NOT CHANGE THIS + # {{range $idx, $item := .Volumes}} + # - name: storage + # mountPath: {{$item.ContainerPath}} + # subPath: {{$.TaskId}}{{$item.ContainerPath}} + # {{end}} - volumes: - - name: storage - persistentVolumeClaim: - claimName: funnel-pvc \ No newline at end of file + # volumes: + # - name: storage + # persistentVolumeClaim: + # claimName: funnel-pvc \ No newline at end of file diff --git a/config/kubernetes-template.yaml b/config/kubernetes-template.yaml index e832fac79..0e02cb6bf 100644 --- a/config/kubernetes-template.yaml +++ b/config/kubernetes-template.yaml @@ -29,9 +29,9 @@ spec: 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: funnel-storage-{{.TaskId}} - mountPath: /opt/funnel/funnel-work-dir/{{.TaskId}} - subPath: {{.TaskId}} + # - name: funnel-storage-{{.TaskId}} + # mountPath: /opt/funnel/funnel-work-dir/{{.TaskId}} + # subPath: {{.TaskId}} - name: config-volume mountPath: /etc/config @@ -39,6 +39,6 @@ spec: - name: config-volume configMap: name: funnel-config - - name: funnel-storage-{{.TaskId}} - persistentVolumeClaim: - claimName: funnel-pvc \ No newline at end of file + # - name: funnel-storage-{{.TaskId}} + # persistentVolumeClaim: + # claimName: funnel-pvc \ No newline at end of file diff --git a/deployments/kubernetes/helm/.cr-release-packages/funnel-0.1.9.tgz b/deployments/kubernetes/helm/.cr-release-packages/funnel-0.1.9.tgz new file mode 100644 index 0000000000000000000000000000000000000000..9309f792aaf6f248520d6a5ed77345f99ff502b3 GIT binary patch literal 7263 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 literal 0 HcmV?d00001 diff --git a/deployments/kubernetes/helm/funnel-0.1.2.tgz b/deployments/kubernetes/helm/funnel-0.1.2.tgz new file mode 100644 index 0000000000000000000000000000000000000000..bb33009c3cb6e56f943a749db2b78d16158a015d GIT binary patch literal 6775 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%0DRzHL8@rS;YuFT3}-^=HZ&b zT3Jzbh^C7-t8B=Rz?*`Ju9&-uCSx&CkvZVxtul)+Cpu1FH(Ka#W7S@*+d8tn@e<S47R8W&|fVLtgAkM6JPPX2dl zH!o6p2qhN&H_+iK_EAv?*(JgAU8;4_rOmTx>*}V}s^G((QD}dkQuhPzz9uYN4J|GApsiUjXi~pca_=X)K;cuGa{Z%0 zbD9yBx5vO-HTAZMu~@__jjba;_Eu>dX`fm8N3W`XowQ>A6^pIk0=U8cn~V>-@&5zN zdb0l>A$0>iR;iw%hx5Z`zp{eHAX!(v8*7d#~ww!#D z+J7AFyCVNmWOU04V59xFa{l9B|7hgin5qXgu?qt`lK9JhjAO|3h4#{~ zK1vz{?81N)MK2+>H@;5~xUkEnU)?IeJ{LPyMTs*T47l^FLBAuE@XJ z-`S=KxJmvG_YYRj|32A&kCJ-5J11LfW%$8z>-?+LS2G&BH9fmDg%n!EB8%Yq^up(L zH)=GIbE-T0H>>+L>v1)W}Ve8AO21)%$y$ zlSkeZxSdn&mU(yHXj-b}RJ^ZFEZM_9@b9k>^sE2&=dt8mVdlnOH_s<|>lrN!xVtmR zBsCWx`Q5s=bV22xMiV*tUwaa18*OZm|AV8w?)#sI2S-o)KaY~CC&n5~>@RJ;y9+wk zD)nE3)V^$I-7+6Eo>^-&R^4Zf5ZxEWP+>^I=k=#&O$e(ch6bDc-TX?XetXP4D%NP! zmW8Ik)@;5LwhCC68r1b8V)YAQjY_sStezJ$4b%^R^+38e1TAFs*4HZFrF~n_!mYkE zwOYZ$Xk8c>Lw@Tis?M8J4HOkv*n+W*S2sZPR`B<+7|`bZC%w=$fF0fD8%OPTi<%wu zP+=3qw%B>7=-yfe##UQ-im10@2db{xdS_^D)drO5t$&Q@{H#?8v%~Xb{a_n_77fi8 zOuB$|nd7nccBXw*r(3B43e6SLZj;qLtg{|inhP2ow0~1)J$PboUc|AeU&g7PENRrU zrT+3s+d%7OnpN0Fv4!tE^s-u`1yI$gA9U%h;fo!7>&=y(3XSqgLV8|SS*_UzX9li* zv*e)`4BpT|j?ZSu$T5FTK&XWnLSo3R^>%)GNc-EY9^hK06Gr=-tw za6yH2qY|n`9L9F-I}EBnS}GqeIsI=QciZ}hA1-Z*|4t^|_|M+q z-qZf?qohv!mvXN|?}F-1;s^$N