Skip to content

Commit

Permalink
Allowed multiple values of secrets (#34)
Browse files Browse the repository at this point in the history
  • Loading branch information
b1es committed Oct 28, 2022
1 parent c95b403 commit 3e9830e
Show file tree
Hide file tree
Showing 4 changed files with 67 additions and 31 deletions.
44 changes: 38 additions & 6 deletions models/examples/if-else-statement.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,14 @@
{
"value": "10",
"target": "max"
},
{
"value": "SECRET_PASS",
"target": "secretL1"
},
{
"value": "SECRET_PASS",
"target": "secretL2"
}
],
"workflow":
Expand All @@ -18,7 +26,9 @@
"uid": "192161d7-e3f2-4991-adc0-a99c88c144c0",
"description": "Graph component",
"inputs": [
{ "name": "max", "mediatype": ["integer"], "type": "parameter" }
{ "name": "max", "mediatype": ["integer"], "type": "parameter" },
{ "name": "secretL1", "type": "env_secret" },
{ "name": "secretL2", "type": "env_secret" }
],
"outputs": [
{ "name": "description", "type": "parameter" }
Expand All @@ -30,6 +40,14 @@
{
"source": { "port": "max" },
"target": { "node": "N1", "port": "value" }
},
{
"source": { "port": "secretL1" },
"target": { "node": "N1", "port": "secretB1" }
},
{
"source": { "port": "secretL2" },
"target": { "node": "If", "port": "secretPass" }
}
],
"outputMappings": [
Expand All @@ -46,7 +64,8 @@
"uid": "192161d7-e3f2-4991-adc0-a99c88c144b0",
"description": "Generate",
"inputs": [
{ "name": "value", "type": "parameter" }
{ "name": "value", "type": "parameter" },
{ "name": "secretB1", "type": "env_secret" }
],
"outputs": [
{ "name": "rand", "type": "parameter" }
Expand All @@ -57,7 +76,7 @@
"container": {
"name": "containername_n1_b1",
"image": "bash:latest",
"command": ["bash", "-c", "shuf -i 0-$0 -n1 > /tmp/out"],
"command": ["bash", "-c", "echo SecretB1 $secretB1; shuf -i 0-$0 -n1 > /tmp/out"],
"args": []
},
"args": [
Expand Down Expand Up @@ -85,7 +104,8 @@
"name": "valFromParam",
"mediatype": ["number"],
"type": "parameter"
}
},
{ "name": "secretPass", "type": "env_secret" }
],
"outputs": [
{ "name": "ifOut", "type": "parameter" }
Expand All @@ -97,6 +117,10 @@
{
"source": { "port": "valFromParam" },
"target": { "port": "valParam" }
},
{
"source": { "port": "secretPass" },
"target": { "port": "envValue" }
}
],
"outputMappings": [
Expand All @@ -113,6 +137,10 @@
"name": "valParam",
"mediatype": ["number"],
"type": "parameter"
},
{
"name": "envValue",
"type": "env_secret"
}
],
"outputs": [
Expand All @@ -127,7 +155,7 @@
"command": [
"sh",
"-c",
"echo value $0 is huge > /tmp/out"
"echo env $envValue; echo value $0 is huge > /tmp/out"
],
"args": []
},
Expand All @@ -153,6 +181,10 @@
"name": "valParam",
"mediatype": ["number"],
"type": "parameter"
},
{
"name": "envValue",
"type": "env_secret"
}
],
"outputs": [
Expand All @@ -167,7 +199,7 @@
"command": [
"sh",
"-c",
"echo value $0 is small > /tmp/out"
"echo env $envValue; echo value $0 is small > /tmp/out"
],
"args": []
},
Expand Down
3 changes: 1 addition & 2 deletions transpiler/helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,7 @@ func getNodeSecretMap(targetNodeId string, cmpSecrets secretMap, cmpInputs []mod
for _, m := range inputsMap {
mt, ok := checkInputType(cmpInputs, m.Source.Port)
if ok && mt == models.FlowifySecretType && m.Target.Node == targetNodeId {
k, _ := findKeyFor(nSecrets, m.Source.Port)
nSecrets[k] = m.Target.Port
nSecrets[m.Target.Port] = cmpSecrets[m.Source.Port]
}
}
return nSecrets
Expand Down
38 changes: 20 additions & 18 deletions transpiler/transpiler.go
Original file line number Diff line number Diff line change
Expand Up @@ -72,9 +72,9 @@ func AddBrick(name string, cmp *models.Brick, outputs wfv1.Outputs, inputs wfv1.
container.Args = args
envs := []corev1.EnvVar{}
for k, e := range sMap {
s := corev1.SecretKeySelector{LocalObjectReference: corev1.LocalObjectReference{Name: secret.DefaultObjectName}, Key: k}
s := corev1.SecretKeySelector{LocalObjectReference: corev1.LocalObjectReference{Name: secret.DefaultObjectName}, Key: e}
vf := corev1.EnvVarSource{SecretKeyRef: &s}
env := corev1.EnvVar{Name: e, ValueFrom: &vf}
env := corev1.EnvVar{Name: k, ValueFrom: &vf}
envs = append(envs, env)
}
container.Env = envs
Expand Down Expand Up @@ -155,7 +155,7 @@ func AddGraph(name string, cmp *models.Graph, outputs wfv1.Outputs, inputs wfv1.
errors.Errorf("Unrecognized implementation type: %s", impCmp)
}
case models.FlowifyVolumeType:
logrus.Info("Ref volume edge: ", e)
logrus.Debug("Ref volume edge:", e)
default:
return errors.Errorf("Unrecognized edge target-type, '%s', for target port-address '%s.%s'", it, e.Target.Node, e.Target.Port)
}
Expand Down Expand Up @@ -425,12 +425,11 @@ func TraverseComponent(cmp *models.Component, templates *[]wfv1.Template, tasks
}
inParams = append(inParams, param)
case models.FlowifySecretType:
_, ok := findKeyFor(cmpSecrets, i.Name)
if !ok {
cmpSecrets[i.Name] = i.Name
if _, ok := cmpSecrets[i.Name]; !ok {
return nil, fmt.Errorf("missing secret <%s> for component: %s", i.Name, cmp.Uid)
}
case models.FlowifyVolumeType:
logrus.Info("Ref mount: ", i.Name, volumes[i.Name])
logrus.Debugf("Ref mount: %s %s", i.Name, volumes[i.Name])
default:
return nil, fmt.Errorf("cannot append input data (name: %s, type %s) at node %s", i.Name, i.Type, cmpName)
}
Expand Down Expand Up @@ -468,8 +467,7 @@ func TraverseComponent(cmp *models.Component, templates *[]wfv1.Template, tasks
if mt, ok := checkInputType(cmp.Inputs, m.Source.Port); ok {
switch mt {
case models.FlowifySecretType:
k, _ := findKeyFor(nodeSecrets, m.Source.Port)
nodeSecrets[k] = m.Target.Port
nodeSecrets[m.Target.Port] = cmpSecrets[m.Source.Port]
case models.FlowifyVolumeType:
if val, ok := volumes[m.Source.Port]; ok {
nodeVolumes[m.Target.Port] = val
Expand Down Expand Up @@ -508,12 +506,11 @@ func TraverseComponent(cmp *models.Component, templates *[]wfv1.Template, tasks
if mt, ok := checkInputType(cmp.Inputs, m.Source.Port); ok {
switch mt {
case models.FlowifySecretType:
k, _ := findKeyFor(nodeSecrets, m.Source.Port)
nodeSecrets[k] = m.Target.Port
nodeSecrets[m.Target.Port] = cmpSecrets[m.Source.Port]
case models.FlowifyVolumeType:
if val, ok := volumes[m.Source.Port]; ok {
nodeVolumes[m.Target.Port] = val
logrus.Infof("Rewriting nodeVolumes for %s: %s -> %s", cmp.Name, m.Source.Port, m.Target.Port)
logrus.Debugf("Rewriting nodeVolumes for %s: %s -> %s", cmp.Name, m.Source.Port, m.Target.Port)
}
}
}
Expand All @@ -538,7 +535,7 @@ func TraverseComponent(cmp *models.Component, templates *[]wfv1.Template, tasks
scopeVolumes[m.Target.Node] = make(map[string]corev1.Volume, 0)
}
scopeVolumes[m.Target.Node][m.Target.Port] = val
logrus.Infof("Rewriting nodeVolumes for %s: %s -> %s", cmp.Name, m.Source.Port, m.Target.Port)
logrus.Debugf("Rewriting nodeVolumes for %s: %s -> %s", cmp.Name, m.Source.Port, m.Target.Port)
}
}
}
Expand All @@ -551,17 +548,17 @@ func TraverseComponent(cmp *models.Component, templates *[]wfv1.Template, tasks
}
nodeSecrets := getNodeSecretMap(c.Id, cmpSecrets, cmp.Inputs, impCmp.InputMappings)
volumes := getConnectedVolumeMap(c.Id, &tc, impCmp.Edges, impCmp.Nodes, scopeVolumes)
logrus.Info(volumes)
logrus.Debug(volumes)
_, err := TraverseComponent(&tc, templates, tasks, nodeSecrets, volumes)
if err != nil {
return nil, err
}
}
case models.Brick:
for k, elem := range cmpSecrets {
for k, _ := range cmpSecrets {
ex := false
for _, i := range cmp.Inputs {
if elem == i.Name {
if k == i.Name {
ex = true
break
}
Expand Down Expand Up @@ -605,15 +602,20 @@ func GetArgoWorkflow(job models.Job) (*wfv1.Workflow, error) {
secretMapValues := make(secretMap)
for _, cmpInput := range wf.Component.Inputs {
if cmpInput.Type == models.FlowifySecretType {
missing := true
for _, jobInput := range job.InputValues {
if cmpInput.Name == jobInput.Target {
val, ok := jobInput.Value.(string)
if !ok {
return nil, errors.Errorf("Cannot convert flowify secret '%s' to string.", jobInput.Target)
}
secretMapValues[val] = cmpInput.Name
secretMapValues[cmpInput.Name] = val
missing = false
}
}
if missing {
return nil, errors.Errorf("Missing input secret <%s> for job: %s", cmpInput.Name, job.Name)
}
}
}

Expand All @@ -637,7 +639,7 @@ func GetArgoWorkflow(job models.Job) (*wfv1.Workflow, error) {
if err != nil {
return nil, err
}
logrus.Infof("Appending volume from config: %s -> (%s) ", config, v.Target)
logrus.Debugf("Appending volume from config: %s -> (%s) ", config, v.Target)
volumeMap[tgt.Name] = volume // add volume with top level input name
} else {
return nil, fmt.Errorf("mount config must be json encoded string")
Expand Down
13 changes: 8 additions & 5 deletions transpiler/transpiler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,8 @@ const (
}`
)

var secrets = secretMap{"secretWF1": "wf1_secret_value", "secretWF2": "wf2_secret_value"}

func init() {
}

Expand All @@ -202,7 +204,7 @@ func Test_ParseComponentTree(t *testing.T) {
assert.Equal(t, 3, len(wf.Component.Inputs))
assert.Equal(t, 0, len(wf.Component.Outputs))

argoWF, err := ParseComponentTree(wf, secretMap{}, volumeMap{}, map[string]string{}, map[string]string{})
argoWF, err := ParseComponentTree(wf, secrets, volumeMap{}, map[string]string{}, map[string]string{})
assert.Nil(t, err)
assert.True(t, len(argoWF.Spec.Templates) == 4, "Expected no. of templates is 4.")
// assert.Equal(t, "seedWF", argoWF.Spec.Arguments.Parameters[0].Name)
Expand All @@ -222,17 +224,17 @@ func Test_ParseComponentTree(t *testing.T) {
for _, env := range template.Container.Env {
switch env.Name {
case "secretN1":
assert.Equal(t, "secretWF1", env.ValueFrom.SecretKeyRef.Key)
assert.Equal(t, secrets["secretWF1"], env.ValueFrom.SecretKeyRef.Key)
case "secretN2":
assert.Equal(t, "secretWF2", env.ValueFrom.SecretKeyRef.Key)
assert.Equal(t, secrets["secretWF2"], env.ValueFrom.SecretKeyRef.Key)
default:
t.Errorf("Unexpected secret %s in brick %s.", env.Name, template.Name)
}
}
case "192161d7-e3f2-4991-adc0-a99c88c144b2":
assert.Equal(t, 1, len(template.Container.Env))
assert.Equal(t, "secretN1", template.Container.Env[0].Name)
assert.Equal(t, "secretWF2", template.Container.Env[0].ValueFrom.SecretKeyRef.Key)
assert.Equal(t, secrets["secretWF2"], template.Container.Env[0].ValueFrom.SecretKeyRef.Key)
default:
t.Errorf("Unexpected template %s.", template.Name)
}
Expand All @@ -244,7 +246,8 @@ func Test_RemoveDuplicatedTemplates(t *testing.T) {
err := json.Unmarshal([]byte(minimalExampleJSON), &wf)
assert.Nil(t, err)

job := models.Job{Metadata: models.Metadata{Description: "test job"}, Type: "job", InputValues: nil, Workflow: wf}
inputValues := []models.Value{{Value: secrets["secretWF1"], Target: "secretWF1"}, {Value: secrets["secretWF2"], Target: "secretWF2"}}
job := models.Job{Metadata: models.Metadata{Description: "test job"}, Type: "job", InputValues: inputValues, Workflow: wf}
argoWF, err := GetArgoWorkflow(job)
assert.Nil(t, err)
assert.True(t, len(argoWF.Spec.Templates) == 3, "Expected no. of templates is 3.")
Expand Down

2 comments on commit 3e9830e

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Coverage for this commit

61.85%

Coverage Report
FileStmtsBranchesFuncsLinesUncovered Lines
apiserver
   apiserver.go60.34%100%100%60.34%100–113, 153–155, 160–163, 165, 174–177, 210–214, 216, 56–58, 60–62, 64–76, 79–85, 87–90, 92–98
   config.go0%100%100%0%101–106, 108–111, 113, 117–124, 126–131, 42–48, 51–62, 64, 67–76, 78–95
auth
   azure_token.go58.14%100%100%58.14%104–105, 127–128, 136–137, 146–147, 67–72, 74–80, 82–86, 88–93, 96–99
   auth.go0%100%100%0%101–104, 107–112, 115–121, 123–126, 129–134, 137–158, 162–166, 168, 22–24, 37–44, 78–87, 90, 93–99
   config.go0%100%100%0%26–35, 37–51, 53–56, 58, 61–72, 74–77
models
   validate.go60%100%100%60%18–20, 23–24, 33–35, 49–54, 61–62, 66–67
   models.go71.39%100%100%71.39%1004–1009, 1011, 1018–1019, 1029–1030, 1038–1040, 1049–1054, 1056, 1080–1081, 1091, 1097–1101, 1108, 1116–1117, 1130–1131, 1143–1144, 1156, 1162–1166, 117, 1175, 118, 1183–1184, 127–138, 140–143, 148–150, 154–155, 169–171, 185–186, 208–209, 217–220, 241–243, 247–249, 256–258, 273–276, 279–281, 283–285, 287–290, 292–293, 360–362, 373–374, 385–386, 394–398, 408–409, 418–419, 430–431, 439–443, 456–458, 470–471, 496, 503–504, 51, 513–514, 52–54, 540, 55, 57, 573–575, 582–584, 590–592, 598–600, 606–608, 614–616, 618–619, 671–672, 682–683, 693–694, 704–705, 715–716, 719–720, 777–778, 79, 799, 80, 800–808, 815–816, 824–825, 845–849, 851, 883–884, 89–91, 912, 919–920, 928–929, 949, 984–985, 993–995
   job.go88%100%100%88%22–23, 40
pkg/secret
   config.go0%100%100%0%22–27, 29–31, 33–37, 39–42, 44–51, 54–59, 61–65, 67
   mock.go0%100%100%0%13–20, 22–25, 27–30, 32–35
   secret.go82.78%100%100%82.78%123–124, 134–135, 149–150, 155–156, 161–162, 167–168, 49–51, 58–59, 72–73, 83–89
pkg/workspace
   workspace.go58.39%100%100%58.39%128–129, 136–137, 161–163, 170–172, 181–183, 185–193, 197–199, 202, 204, 207–210, 212–220, 224–226, 229, 231, 242–243, 252–253, 61–65, 67–69
   mock.go0%100%100%0%13–18, 20–23, 25–28, 30–33
rest
   workspaces.go100%100%100%100%
   secrets.go96.94%100%100%96.94%110–112
   rest.go65.31%100%100%65.31%110–129, 131–135, 156–157, 164, 175–177, 247, 47–48, 53–54, 56–57, 63–64, 71–73, 76–80, 82–84
   workflows.go55.43%100%100%55.43%101–102, 112–114, 118–120, 123–126, 130–133, 144–146, 150–152, 154–156, 160–164, 175–177, 181–188, 194–198, 206–207, 214–215, 219–221, 228–229, 234–236, 247–250, 57–59, 62–64, 67–68, 73–75, 85–87, 90–92, 97–99
   volumes.go73.68%100%100%73.68%106–108, 122–124, 128–130, 138–140, 144–146, 160–162, 177–179, 45–47, 53–55, 69–71, 78–79, 85–87
   jobs.go56.86%100%100%56.86%106–108, 112–114, 119–121, 125–128, 134–136, 141–143, 155–161, 164–165, 178–180, 184–186, 190–192, 194–196, 210–214, 216–220, 222–226, 228, 238–241, 244–246, 249–252, 258–261, 287–288, 293–294, 309, 31, 310, 32, 327–329, 33, 334–337, 346–347, 35, 351–353, 36, 360–361, 376–377, 38–39, 394–395, 40, 401–410, 73–78, 80–84, 86–90, 92, 98–99
   components.go57.93%100%100%57.93%108–109, 113–115, 125–127, 131–133, 135–136, 140–143, 153–155, 158–160, 165–167, 169–170, 180–186, 188, 191–198, 207–208, 211–212, 220–222, 230–231, 235–237, 24–25, 251–253, 257–260, 265–268, 279, 28, 280–281, 285–287, 29, 290–293, 297–299, 310–312, 316–318, 326–331, 341–342, 345–346, 353–354, 370–373, 378–379, 381–382, 386–388, 395–396, 400–402, 414–417, 42–43, 92–94, 97–99
   userinfo.go0%100%100%0%10–25
storage
   references.go72.50%100%100%72.50%100–101, 23–24, 35–36, 42–43, 46–47, 59–60, 65–66, 76–77, 80–81, 87–88, 96–97
   parsequery.go82.91%100%100%82.91%106–107, 138–139, 147–148, 47–48, 62–63, 74–77, 82–83, 87–88, 95–96
   mongo.go62.76%100%100%62.76%100, 1004–1005, 101–102, 1042–1043, 1048–1049, 1059–1060, 1068–1069, 1074–1079, 108, 1081–1089, 109, 1090–1095, 1098–1099, 110, 1100–1127, 1129–1143, 1148–1149, 1167–1168, 1176–1177, 1192–1193, 1212–1213, 1218–1219, 1245–1246, 1259–1260, 1262–1264, 1303–1304, 1309–1310, 1320–1321, 1329–1330, 139–145, 149–151, 157–163, 166–195, 217–218, 235–236, 249–250, 256–257, 262–263, 267–268, 271–272, 293–301, 305–306, 319–320, 323–324, 328–329, 346–347, 359–360, 396–397, 405–406, 409–410, 443–444, 449–469, 471–477, 479, 503–504, 516–517, 525–526, 530–531, 537–538, 543–544, 551–552, 560–561, 569–570, 581–582, 594–595, 599–600, 608–609, 61, 619, 62, 621–622, 63–65, 651–652, 66, 661–662, 665–666, 67, 671–672, 68, 684–685, 697–698, 70–73, 738–739, 745–746, 75, 756–757, 765–766, 771–784, 787–816, 818–832, 846–847, 853–854, 859–860, 865–869, 87, 870–879, 88, 880–892, 900–901, 91, 912–913, 92–99, 990–991
   mongovolumestorage.go74.69%100%100%74.69%110–111, 118–119, 125–126, 136–137, 145–146, 160–161, 172–173, 181–182, 199–200, 213–214, 220–221, 226–227, 27–33, 37–39, 56–57, 67–68, 70–72
   local.go0%100%100%0%100–101, 103, 106–112, 114–124, 127, 18–21, 25–31, 33–38, 40, 43–53, 56, 61–67, 69–74, 76, 79–89, 92, 96–99
transpiler
   argo.go100%100%100%100%
   transpiler.go63.06%100%100%63.06%118–119, 124–128, 143–155, 159–160, 201–229, 23, 230–232, 236–239, 24, 240–252, 254–257, 261–269, 275–277, 282–284, 287–288, 291–292, 296–297, 311–313, 316–317, 322–326, 332–333, 368–374, 403–404, 421–426, 429–430, 433–434, 458–459, 462–463, 471–475, 481–482, 487–488, 491–492, 494–514, 518–521, 525–526, 547–548, 554–555, 572–575, 588–589, 610–611, 617–618, 640–641, 644–646, 65, 653–654, 66, 665–672, 96–98
   helpers.go74.26%100%100%74.26%101–102, 107–108, 112–113, 123–124, 130, 143, 153, 160–161, 163–164, 171–172, 182, 191, 200, 217–218, 221–222, 227–228, 231–232, 246–247, 254–255, 26, 292–293, 295–297, 311–312, 330–331, 338–339, 343–344, 350–354, 38–44, 46, 85–86

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Coverage for this commit

61.85%

Coverage Report
FileStmtsBranchesFuncsLinesUncovered Lines
apiserver
   apiserver.go60.34%100%100%60.34%100–113, 153–155, 160–163, 165, 174–177, 210–214, 216, 56–58, 60–62, 64–76, 79–85, 87–90, 92–98
   config.go0%100%100%0%101–106, 108–111, 113, 117–124, 126–131, 42–48, 51–62, 64, 67–76, 78–95
auth
   config.go0%100%100%0%26–35, 37–51, 53–56, 58, 61–72, 74–77
   azure_token.go58.14%100%100%58.14%104–105, 127–128, 136–137, 146–147, 67–72, 74–80, 82–86, 88–93, 96–99
   auth.go0%100%100%0%101–104, 107–112, 115–121, 123–126, 129–134, 137–158, 162–166, 168, 22–24, 37–44, 78–87, 90, 93–99
models
   job.go88%100%100%88%22–23, 40
   models.go71.39%100%100%71.39%1004–1009, 1011, 1018–1019, 1029–1030, 1038–1040, 1049–1054, 1056, 1080–1081, 1091, 1097–1101, 1108, 1116–1117, 1130–1131, 1143–1144, 1156, 1162–1166, 117, 1175, 118, 1183–1184, 127–138, 140–143, 148–150, 154–155, 169–171, 185–186, 208–209, 217–220, 241–243, 247–249, 256–258, 273–276, 279–281, 283–285, 287–290, 292–293, 360–362, 373–374, 385–386, 394–398, 408–409, 418–419, 430–431, 439–443, 456–458, 470–471, 496, 503–504, 51, 513–514, 52–54, 540, 55, 57, 573–575, 582–584, 590–592, 598–600, 606–608, 614–616, 618–619, 671–672, 682–683, 693–694, 704–705, 715–716, 719–720, 777–778, 79, 799, 80, 800–808, 815–816, 824–825, 845–849, 851, 883–884, 89–91, 912, 919–920, 928–929, 949, 984–985, 993–995
   validate.go60%100%100%60%18–20, 23–24, 33–35, 49–54, 61–62, 66–67
pkg/secret
   mock.go0%100%100%0%13–20, 22–25, 27–30, 32–35
   secret.go82.78%100%100%82.78%123–124, 134–135, 149–150, 155–156, 161–162, 167–168, 49–51, 58–59, 72–73, 83–89
   config.go0%100%100%0%22–27, 29–31, 33–37, 39–42, 44–51, 54–59, 61–65, 67
pkg/workspace
   mock.go0%100%100%0%13–18, 20–23, 25–28, 30–33
   workspace.go58.39%100%100%58.39%128–129, 136–137, 161–163, 170–172, 181–183, 185–193, 197–199, 202, 204, 207–210, 212–220, 224–226, 229, 231, 242–243, 252–253, 61–65, 67–69
rest
   workflows.go55.43%100%100%55.43%101–102, 112–114, 118–120, 123–126, 130–133, 144–146, 150–152, 154–156, 160–164, 175–177, 181–188, 194–198, 206–207, 214–215, 219–221, 228–229, 234–236, 247–250, 57–59, 62–64, 67–68, 73–75, 85–87, 90–92, 97–99
   components.go57.93%100%100%57.93%108–109, 113–115, 125–127, 131–133, 135–136, 140–143, 153–155, 158–160, 165–167, 169–170, 180–186, 188, 191–198, 207–208, 211–212, 220–222, 230–231, 235–237, 24–25, 251–253, 257–260, 265–268, 279, 28, 280–281, 285–287, 29, 290–293, 297–299, 310–312, 316–318, 326–331, 341–342, 345–346, 353–354, 370–373, 378–379, 381–382, 386–388, 395–396, 400–402, 414–417, 42–43, 92–94, 97–99
   userinfo.go0%100%100%0%10–25
   secrets.go96.94%100%100%96.94%110–112
   workspaces.go100%100%100%100%
   jobs.go56.86%100%100%56.86%106–108, 112–114, 119–121, 125–128, 134–136, 141–143, 155–161, 164–165, 178–180, 184–186, 190–192, 194–196, 210–214, 216–220, 222–226, 228, 238–241, 244–246, 249–252, 258–261, 287–288, 293–294, 309, 31, 310, 32, 327–329, 33, 334–337, 346–347, 35, 351–353, 36, 360–361, 376–377, 38–39, 394–395, 40, 401–410, 73–78, 80–84, 86–90, 92, 98–99
   rest.go65.31%100%100%65.31%110–129, 131–135, 156–157, 164, 175–177, 247, 47–48, 53–54, 56–57, 63–64, 71–73, 76–80, 82–84
   volumes.go73.68%100%100%73.68%106–108, 122–124, 128–130, 138–140, 144–146, 160–162, 177–179, 45–47, 53–55, 69–71, 78–79, 85–87
storage
   references.go72.50%100%100%72.50%100–101, 23–24, 35–36, 42–43, 46–47, 59–60, 65–66, 76–77, 80–81, 87–88, 96–97
   local.go0%100%100%0%100–101, 103, 106–112, 114–124, 127, 18–21, 25–31, 33–38, 40, 43–53, 56, 61–67, 69–74, 76, 79–89, 92, 96–99
   mongo.go62.76%100%100%62.76%100, 1004–1005, 101–102, 1042–1043, 1048–1049, 1059–1060, 1068–1069, 1074–1079, 108, 1081–1089, 109, 1090–1095, 1098–1099, 110, 1100–1127, 1129–1143, 1148–1149, 1167–1168, 1176–1177, 1192–1193, 1212–1213, 1218–1219, 1245–1246, 1259–1260, 1262–1264, 1303–1304, 1309–1310, 1320–1321, 1329–1330, 139–145, 149–151, 157–163, 166–195, 217–218, 235–236, 249–250, 256–257, 262–263, 267–268, 271–272, 293–301, 305–306, 319–320, 323–324, 328–329, 346–347, 359–360, 396–397, 405–406, 409–410, 443–444, 449–469, 471–477, 479, 503–504, 516–517, 525–526, 530–531, 537–538, 543–544, 551–552, 560–561, 569–570, 581–582, 594–595, 599–600, 608–609, 61, 619, 62, 621–622, 63–65, 651–652, 66, 661–662, 665–666, 67, 671–672, 68, 684–685, 697–698, 70–73, 738–739, 745–746, 75, 756–757, 765–766, 771–784, 787–816, 818–832, 846–847, 853–854, 859–860, 865–869, 87, 870–879, 88, 880–892, 900–901, 91, 912–913, 92–99, 990–991
   parsequery.go82.91%100%100%82.91%106–107, 138–139, 147–148, 47–48, 62–63, 74–77, 82–83, 87–88, 95–96
   mongovolumestorage.go74.69%100%100%74.69%110–111, 118–119, 125–126, 136–137, 145–146, 160–161, 172–173, 181–182, 199–200, 213–214, 220–221, 226–227, 27–33, 37–39, 56–57, 67–68, 70–72
transpiler
   helpers.go74.26%100%100%74.26%101–102, 107–108, 112–113, 123–124, 130, 143, 153, 160–161, 163–164, 171–172, 182, 191, 200, 217–218, 221–222, 227–228, 231–232, 246–247, 254–255, 26, 292–293, 295–297, 311–312, 330–331, 338–339, 343–344, 350–354, 38–44, 46, 85–86
   transpiler.go63.06%100%100%63.06%118–119, 124–128, 143–155, 159–160, 201–229, 23, 230–232, 236–239, 24, 240–252, 254–257, 261–269, 275–277, 282–284, 287–288, 291–292, 296–297, 311–313, 316–317, 322–326, 332–333, 368–374, 403–404, 421–426, 429–430, 433–434, 458–459, 462–463, 471–475, 481–482, 487–488, 491–492, 494–514, 518–521, 525–526, 547–548, 554–555, 572–575, 588–589, 610–611, 617–618, 640–641, 644–646, 65, 653–654, 66, 665–672, 96–98
   argo.go100%100%100%100%

Please sign in to comment.