Browse Source

Fix dapr and environment variable injection (#510)

pull/520/head
Justin Kotalik 6 years ago
committed by GitHub
parent
commit
fc4dc92816
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 7
      src/Microsoft.Tye.Core/CombineStep.cs
  2. 8
      src/Microsoft.Tye.Extensions/Dapr/DaprExtension.cs
  3. 46
      src/Microsoft.Tye.Hosting/Model/Application.cs
  4. 5
      test/E2ETest/ApplicationTests.cs
  5. 14
      test/E2ETest/testassets/generate/apps-with-ingress.yaml
  6. 8
      test/E2ETest/testassets/generate/dapr.yaml
  7. 14
      test/E2ETest/testassets/generate/dockerfile.yaml
  8. 14
      test/E2ETest/testassets/generate/frontend-backend.yaml
  9. 6
      test/E2ETest/testassets/generate/generate-connectionstring-dependency.yaml
  10. 6
      test/E2ETest/testassets/generate/generate-named-binding.yaml
  11. 6
      test/E2ETest/testassets/generate/generate-uri-dependency.yaml
  12. 90
      test/E2ETest/testassets/generate/health-checks.yaml
  13. 14
      test/E2ETest/testassets/generate/multi-project.yaml
  14. 14
      test/E2ETest/testassets/generate/multirepo.yaml
  15. 8
      test/E2ETest/testassets/generate/single-project-noregistry.yaml
  16. 8
      test/E2ETest/testassets/generate/single-project.yaml

7
src/Microsoft.Tye.Core/CombineStep.cs

@ -46,15 +46,18 @@ namespace Microsoft.Tye
} }
} }
var services = new List<string>() { service.Name };
services.AddRange(service.Dependencies);
// Process bindings and turn them into environment variables and secrets. There's // Process bindings and turn them into environment variables and secrets. There's
// some duplication with the code in m8s (Application.cs) for populating environments. // some duplication with the code in m8s (Application.cs) for populating environments.
// //
// service.Service.Bindings is the bindings OUT - this step computes bindings IN. // service.Service.Bindings is the bindings OUT - this step computes bindings IN.
service.Outputs.Add(ComputeBindings(application, service.Dependencies)); service.Outputs.Add(ComputeBindings(application, services));
foreach (var sidecar in project.Sidecars) foreach (var sidecar in project.Sidecars)
{ {
sidecar.Outputs.Add(ComputeBindings(application, sidecar.Dependencies)); sidecar.Outputs.Add(ComputeBindings(application, services));
} }
return Task.CompletedTask; return Task.CompletedTask;

8
src/Microsoft.Tye.Extensions/Dapr/DaprExtension.cs

@ -71,6 +71,14 @@ namespace Microsoft.Tye.Extensions.Dapr
proxy.Args += $" -log-level {logLevel}"; proxy.Args += $" -log-level {logLevel}";
} }
// Add dapr proxy as a service available to everyone.
proxy.Dependencies.UnionWith(context.Application.Services.Select(s => s.Name));
foreach (var s in context.Application.Services)
{
s.Dependencies.Add(proxy.Name);
}
context.Application.Services.Add(proxy); context.Application.Services.Add(proxy);
// Listen for grpc on an auto-assigned port // Listen for grpc on an auto-assigned port

46
src/Microsoft.Tye.Hosting/Model/Application.cs

@ -132,33 +132,39 @@ namespace Microsoft.Tye.Hosting.Model
{ {
var bindings = new List<EffectiveBinding>(); var bindings = new List<EffectiveBinding>();
var isDockerRunInfo = service.Description.RunInfo is DockerRunInfo;
GetEffectiveBindings(isDockerRunInfo, defaultHost, bindings, service);
foreach (var serv in service.Description.Dependencies) foreach (var serv in service.Description.Dependencies)
{ {
var s = Services[serv]; GetEffectiveBindings(isDockerRunInfo, defaultHost, bindings, Services[serv]);
}
foreach (var b in s.Description.Bindings) return bindings;
{ }
var protocol = b.Protocol;
var host = b.Host ?? (service.Description.RunInfo is DockerRunInfo ? s.Description.Name : defaultHost);
var port = b.Port; private static void GetEffectiveBindings(bool isDockerRunInfo, string defaultHost, List<EffectiveBinding> bindings, Service service)
if (b.Port is object && service.Description.RunInfo is DockerRunInfo) {
{ foreach (var b in service.Description.Bindings)
port = b.ContainerPort ?? b.Port.Value; {
} var protocol = b.Protocol;
var host = b.Host ?? (isDockerRunInfo ? service.Description.Name : defaultHost);
bindings.Add(new EffectiveBinding( var port = b.Port;
s.Description.Name, if (b.Port is object && isDockerRunInfo)
b.Name, {
protocol, port = b.ContainerPort ?? b.Port.Value;
host,
port,
b.ConnectionString,
s.Description.Configuration));
} }
}
return bindings; bindings.Add(new EffectiveBinding(
service.Description.Name,
b.Name,
protocol,
host,
port,
b.ConnectionString,
service.Description.Configuration));
}
} }
} }
} }

5
test/E2ETest/ApplicationTests.cs

@ -31,10 +31,11 @@ namespace E2ETest
var dictionary = new Dictionary<string, string>(); var dictionary = new Dictionary<string, string>();
app.PopulateEnvironment(app.Services["results"], (s1, s2) => dictionary[s1] = s2); app.PopulateEnvironment(app.Services["results"], (s1, s2) => dictionary[s1] = s2);
// Just the WORKER is defined. // Just the worker and results are defined.
Assert.Equal(8, dictionary.Count); Assert.Equal(16, dictionary.Count);
Assert.Equal("http", dictionary["SERVICE__WORKER__PROTOCOL"]); Assert.Equal("http", dictionary["SERVICE__WORKER__PROTOCOL"]);
Assert.Equal("http", dictionary["SERVICE__RESULTS__PROTOCOL"]);
// No POSTGRES or REDIS // No POSTGRES or REDIS
Assert.False(dictionary.ContainsKey("SERVICE__POSTGRES__PROTOCOL")); Assert.False(dictionary.ContainsKey("SERVICE__POSTGRES__PROTOCOL"));
Assert.False(dictionary.ContainsKey("SERVICE__REDIS__PROTOCOL")); Assert.False(dictionary.ContainsKey("SERVICE__REDIS__PROTOCOL"));

14
test/E2ETest/testassets/generate/apps-with-ingress.yaml

@ -25,6 +25,12 @@ spec:
value: 'http://*' value: 'http://*'
- name: PORT - name: PORT
value: '80' value: '80'
- name: SERVICE__APPA__PROTOCOL
value: 'http'
- name: SERVICE__APPA__PORT
value: '80'
- name: SERVICE__APPA__HOST
value: 'appa'
- name: SERVICE__APPB__PROTOCOL - name: SERVICE__APPB__PROTOCOL
value: 'http' value: 'http'
- name: SERVICE__APPB__PORT - name: SERVICE__APPB__PORT
@ -80,6 +86,12 @@ spec:
value: 'http://*' value: 'http://*'
- name: PORT - name: PORT
value: '80' value: '80'
- name: SERVICE__APPB__PROTOCOL
value: 'http'
- name: SERVICE__APPB__PORT
value: '80'
- name: SERVICE__APPB__HOST
value: 'appb'
- name: SERVICE__APPA__PROTOCOL - name: SERVICE__APPA__PROTOCOL
value: 'http' value: 'http'
- name: SERVICE__APPA__PORT - name: SERVICE__APPA__PORT
@ -143,4 +155,4 @@ spec:
serviceName: appb serviceName: appb
servicePort: 80 servicePort: 80
path: /()(.*) path: /()(.*)
... ...

8
test/E2ETest/testassets/generate/dapr.yaml

@ -1,4 +1,4 @@
kind: Deployment kind: Deployment
apiVersion: apps/v1 apiVersion: apps/v1
metadata: metadata:
name: dapr-test-project name: dapr-test-project
@ -37,6 +37,12 @@ spec:
value: 'http://*' value: 'http://*'
- name: PORT - name: PORT
value: '80' value: '80'
- name: SERVICE__DAPR-TEST-PROJECT__PROTOCOL
value: 'http'
- name: SERVICE__DAPR-TEST-PROJECT__PORT
value: '80'
- name: SERVICE__DAPR-TEST-PROJECT__HOST
value: 'dapr-test-project'
ports: ports:
- containerPort: 80 - containerPort: 80
... ...

14
test/E2ETest/testassets/generate/dockerfile.yaml

@ -1,4 +1,4 @@
kind: Deployment kind: Deployment
apiVersion: apps/v1 apiVersion: apps/v1
metadata: metadata:
name: backend name: backend
@ -25,6 +25,12 @@ spec:
value: 'http://*' value: 'http://*'
- name: PORT - name: PORT
value: '80' value: '80'
- name: SERVICE__BACKEND__PROTOCOL
value: 'http'
- name: SERVICE__BACKEND__PORT
value: '80'
- name: SERVICE__BACKEND__HOST
value: 'backend'
- name: SERVICE__FRONTEND__PROTOCOL - name: SERVICE__FRONTEND__PROTOCOL
value: 'http' value: 'http'
- name: SERVICE__FRONTEND__PORT - name: SERVICE__FRONTEND__PORT
@ -80,6 +86,12 @@ spec:
value: 'http://*' value: 'http://*'
- name: PORT - name: PORT
value: '80' value: '80'
- name: SERVICE__FRONTEND__PROTOCOL
value: 'http'
- name: SERVICE__FRONTEND__PORT
value: '80'
- name: SERVICE__FRONTEND__HOST
value: 'frontend'
- name: SERVICE__BACKEND__PROTOCOL - name: SERVICE__BACKEND__PROTOCOL
value: 'http' value: 'http'
- name: SERVICE__BACKEND__PORT - name: SERVICE__BACKEND__PORT

14
test/E2ETest/testassets/generate/frontend-backend.yaml

@ -1,4 +1,4 @@
kind: Deployment kind: Deployment
apiVersion: apps/v1 apiVersion: apps/v1
metadata: metadata:
name: backend name: backend
@ -25,6 +25,12 @@ spec:
value: 'http://*' value: 'http://*'
- name: PORT - name: PORT
value: '80' value: '80'
- name: SERVICE__BACKEND__PROTOCOL
value: 'http'
- name: SERVICE__BACKEND__PORT
value: '80'
- name: SERVICE__BACKEND__HOST
value: 'backend'
- name: SERVICE__FRONTEND__PROTOCOL - name: SERVICE__FRONTEND__PROTOCOL
value: 'http' value: 'http'
- name: SERVICE__FRONTEND__PORT - name: SERVICE__FRONTEND__PORT
@ -80,6 +86,12 @@ spec:
value: 'http://*' value: 'http://*'
- name: PORT - name: PORT
value: '80' value: '80'
- name: SERVICE__FRONTEND__PROTOCOL
value: 'http'
- name: SERVICE__FRONTEND__PORT
value: '80'
- name: SERVICE__FRONTEND__HOST
value: 'frontend'
- name: SERVICE__BACKEND__PROTOCOL - name: SERVICE__BACKEND__PROTOCOL
value: 'http' value: 'http'
- name: SERVICE__BACKEND__PORT - name: SERVICE__BACKEND__PORT

6
test/E2ETest/testassets/generate/generate-connectionstring-dependency.yaml

@ -25,6 +25,12 @@ spec:
value: 'http://*' value: 'http://*'
- name: PORT - name: PORT
value: '80' value: '80'
- name: SERVICE__FRONTEND__PROTOCOL
value: 'http'
- name: SERVICE__FRONTEND__PORT
value: '80'
- name: SERVICE__FRONTEND__HOST
value: 'frontend'
- name: CONNECTIONSTRINGS__DEPENDENCY - name: CONNECTIONSTRINGS__DEPENDENCY
valueFrom: valueFrom:
secretKeyRef: secretKeyRef:

6
test/E2ETest/testassets/generate/generate-named-binding.yaml

@ -25,6 +25,12 @@ spec:
value: 'http://*' value: 'http://*'
- name: PORT - name: PORT
value: '80' value: '80'
- name: SERVICE__FRONTEND__PROTOCOL
value: 'http'
- name: SERVICE__FRONTEND__PORT
value: '80'
- name: SERVICE__FRONTEND__HOST
value: 'frontend'
- name: SERVICE__DEPENDENCY__MYBINDING__PROTOCOL - name: SERVICE__DEPENDENCY__MYBINDING__PROTOCOL
valueFrom: valueFrom:
secretKeyRef: secretKeyRef:

6
test/E2ETest/testassets/generate/generate-uri-dependency.yaml

@ -25,6 +25,12 @@ spec:
value: 'http://*' value: 'http://*'
- name: PORT - name: PORT
value: '80' value: '80'
- name: SERVICE__FRONTEND__PROTOCOL
value: 'http'
- name: SERVICE__FRONTEND__PORT
value: '80'
- name: SERVICE__FRONTEND__HOST
value: 'frontend'
- name: SERVICE__DEPENDENCY__PROTOCOL - name: SERVICE__DEPENDENCY__PROTOCOL
valueFrom: valueFrom:
secretKeyRef: secretKeyRef:

90
test/E2ETest/testassets/generate/health-checks.yaml

@ -17,44 +17,50 @@ spec:
app.kubernetes.io/part-of: 'health-checks' app.kubernetes.io/part-of: 'health-checks'
spec: spec:
containers: containers:
- name: health-all - name: health-all
image: health-all:1.0.0 image: health-all:1.0.0
imagePullPolicy: Always imagePullPolicy: Always
env: env:
- name: ASPNETCORE_URLS - name: ASPNETCORE_URLS
value: 'http://*:8004' value: 'http://*:8004'
- name: PORT - name: PORT
value: '8004' value: '8004'
ports: - name: SERVICE__HEALTH-ALL__PROTOCOL
- containerPort: 8004 value: 'http'
livenessProbe: - name: SERVICE__HEALTH-ALL__PORT
httpGet: value: '8004'
path: /healthy - name: SERVICE__HEALTH-ALL__HOST
port: 8004 value: 'health-all'
scheme: HTTP ports:
httpHeaders: - containerPort: 8004
- name: name1 livenessProbe:
value: value1 httpGet:
- name: name2 path: /healthy
value: value2 port: 8004
initialDelaySeconds: 5 scheme: HTTP
periodSeconds: 1 httpHeaders:
successThreshold: 1 - name: name1
failureThreshold: 1 value: value1
readinessProbe: - name: name2
httpGet: value: value2
path: /ready initialDelaySeconds: 5
port: 8004 periodSeconds: 1
scheme: HTTP successThreshold: 1
httpHeaders: failureThreshold: 1
- name: name3 readinessProbe:
value: value3 httpGet:
- name: name4 path: /ready
value: value4 port: 8004
initialDelaySeconds: 5 scheme: HTTP
periodSeconds: 1 httpHeaders:
successThreshold: 1 - name: name3
failureThreshold: 1 value: value3
- name: name4
value: value4
initialDelaySeconds: 5
periodSeconds: 1
successThreshold: 1
failureThreshold: 1
... ...
--- ---
kind: Service kind: Service
@ -69,8 +75,8 @@ spec:
app.kubernetes.io/name: health-all app.kubernetes.io/name: health-all
type: ClusterIP type: ClusterIP
ports: ports:
- name: http - name: http
protocol: TCP protocol: TCP
port: 8004 port: 8004
targetPort: 8004 targetPort: 8004
... ...

14
test/E2ETest/testassets/generate/multi-project.yaml

@ -1,4 +1,4 @@
kind: Deployment kind: Deployment
apiVersion: apps/v1 apiVersion: apps/v1
metadata: metadata:
name: backend name: backend
@ -25,6 +25,12 @@ spec:
value: 'http://*:7000' value: 'http://*:7000'
- name: PORT - name: PORT
value: '7000' value: '7000'
- name: SERVICE__BACKEND__PROTOCOL
value: 'http'
- name: SERVICE__BACKEND__PORT
value: '7000'
- name: SERVICE__BACKEND__HOST
value: 'backend'
- name: SERVICE__FRONTEND__PROTOCOL - name: SERVICE__FRONTEND__PROTOCOL
value: 'http' value: 'http'
- name: SERVICE__FRONTEND__PORT - name: SERVICE__FRONTEND__PORT
@ -95,6 +101,12 @@ spec:
value: 'http://*:8000' value: 'http://*:8000'
- name: PORT - name: PORT
value: '8000' value: '8000'
- name: SERVICE__FRONTEND__PROTOCOL
value: 'http'
- name: SERVICE__FRONTEND__PORT
value: '8000'
- name: SERVICE__FRONTEND__HOST
value: 'frontend'
- name: SERVICE__BACKEND__PROTOCOL - name: SERVICE__BACKEND__PROTOCOL
value: 'http' value: 'http'
- name: SERVICE__BACKEND__PORT - name: SERVICE__BACKEND__PORT

14
test/E2ETest/testassets/generate/multirepo.yaml

@ -1,4 +1,4 @@
kind: Deployment kind: Deployment
apiVersion: apps/v1 apiVersion: apps/v1
metadata: metadata:
name: results name: results
@ -25,6 +25,12 @@ spec:
value: 'http://*' value: 'http://*'
- name: PORT - name: PORT
value: '80' value: '80'
- name: SERVICE__RESULTS__PROTOCOL
value: 'http'
- name: SERVICE__RESULTS__PORT
value: '80'
- name: SERVICE__RESULTS__HOST
value: 'results'
- name: SERVICE__WORKER__PROTOCOL - name: SERVICE__WORKER__PROTOCOL
value: 'http' value: 'http'
- name: SERVICE__WORKER__PORT - name: SERVICE__WORKER__PORT
@ -80,6 +86,12 @@ spec:
value: 'http://*' value: 'http://*'
- name: PORT - name: PORT
value: '80' value: '80'
- name: SERVICE__WORKER__PROTOCOL
value: 'http'
- name: SERVICE__WORKER__PORT
value: '80'
- name: SERVICE__WORKER__HOST
value: 'worker'
- name: CONNECTIONSTRINGS__REDIS - name: CONNECTIONSTRINGS__REDIS
valueFrom: valueFrom:
secretKeyRef: secretKeyRef:

8
test/E2ETest/testassets/generate/single-project-noregistry.yaml

@ -1,4 +1,4 @@
kind: Deployment kind: Deployment
apiVersion: apps/v1 apiVersion: apps/v1
metadata: metadata:
name: test-project name: test-project
@ -25,6 +25,12 @@ spec:
value: 'http://*' value: 'http://*'
- name: PORT - name: PORT
value: '80' value: '80'
- name: SERVICE__TEST-PROJECT__PROTOCOL
value: 'http'
- name: SERVICE__TEST-PROJECT__PORT
value: '80'
- name: SERVICE__TEST-PROJECT__HOST
value: 'test-project'
ports: ports:
- containerPort: 80 - containerPort: 80
... ...

8
test/E2ETest/testassets/generate/single-project.yaml

@ -1,4 +1,4 @@
kind: Deployment kind: Deployment
apiVersion: apps/v1 apiVersion: apps/v1
metadata: metadata:
name: test-project name: test-project
@ -25,6 +25,12 @@ spec:
value: 'http://*' value: 'http://*'
- name: PORT - name: PORT
value: '80' value: '80'
- name: SERVICE__TEST-PROJECT__PROTOCOL
value: 'http'
- name: SERVICE__TEST-PROJECT__PORT
value: '80'
- name: SERVICE__TEST-PROJECT__HOST
value: 'test-project'
ports: ports:
- containerPort: 80 - containerPort: 80
... ...

Loading…
Cancel
Save