feat(legacy): improve legacy support, add more tests

This commit is contained in:
Jaka Hudoklin 2019-10-21 12:20:57 +02:00
parent 086780088c
commit 29b1140178
No known key found for this signature in database
GPG key ID: D1F18234B07BD6E2
5 changed files with 189 additions and 74 deletions

View file

@ -30,7 +30,8 @@ let
./k8s/order.nix
./k8s/submodule.nix
./k8s/imports.nix
./k8s/legacy.nix
./legacy/k8s.nix
./legacy/modules.nix
./helm/simple.nix
./istio/bookinfo.nix
./submodules/simple.nix

View file

@ -1,58 +0,0 @@
{ config, lib, kubenix, pkgs, k8sVersion, ... }:
with lib;
{
imports = with kubenix.modules; [ test k8s legacy ];
test = {
name = "k8s-legacy";
description = "Simple test tesing kubenix legacy support";
assertions = [];
};
kubernetes.version = k8sVersion;
kubernetes.moduleDefinitions.app.module = { config, k8s, ... }: {
options = {
replicas = mkOption {
description = "Number of replicas to run";
type = types.int;
default = 2;
};
};
config.kubernetes.defaults = {
all = [{
metadata.labels.default = "value";
}];
deployments = [{
metadata.labels.default2 = "value2";
} {
metadata.labels.default3 = "value3";
}];
};
config.kubernetes.resources.deployments.app = {
spec = {
replicas = config.replicas;
selector = {
matchLabels.app = "app";
};
template.spec = {
containers.app = {
image = "hello-world";
};
};
};
};
};
kubernetes.modules.myapp = {
module = "app";
namespace = "test";
configuration.replicas = 3;
};
}

57
tests/legacy/k8s.nix Normal file
View file

@ -0,0 +1,57 @@
{ config, lib, kubenix, pkgs, k8sVersion, ... }:
with lib;
let
cfg = config.kubernetes.api.resources.deployments.app;
in {
imports = with kubenix.modules; [ test k8s legacy ];
test = {
name = "legacy-k8s";
description = "Simple test kubenix legacy kubernetes support";
assertions = [{
message = "should have correct resource options set";
assertion =
cfg.kind == "Deployment" &&
cfg.metadata.name == "app";
} {
message = "should have correct defaults set";
assertion =
cfg.metadata.namespace == "test" &&
cfg.metadata.labels.label1 == "value1" &&
cfg.metadata.labels.label2 == "value2";
}];
};
kubernetes.version = k8sVersion;
kubernetes.resources.deployments.app = {
spec = {
replicas = 2;
selector = {
matchLabels.app = "app";
};
template.spec = {
containers.app = {
image = "hello-world";
};
};
};
};
kubernetes.resources.configMaps.app = {
data."my-conf.json" = builtins.toJSON {};
};
kubernetes.defaults = {
all = [{
metadata.namespace = "test";
metadata.labels.label1 = "value1";
}];
deployments = [{
metadata.labels.label2 = "value2";
}];
};
}

108
tests/legacy/modules.nix Normal file
View file

@ -0,0 +1,108 @@
{ options, config, lib, kubenix, pkgs, k8sVersion, ... }:
with lib;
let
findObject = { kind, name }: filter (object:
object.kind == kind && object.metadata.name == name
) config.kubernetes.objects;
getObject = filter: head (findObject filter);
hasObject = { kind, name }: length (findObject { inherit kind name; }) == 1;
in {
imports = with kubenix.modules; [ test k8s legacy ];
test = {
name = "legacy-modules";
description = "Simple test tesing kubenix legacy modules";
assertions = [{
message = "should have all objects";
assertion =
hasObject {kind = "Deployment"; name = "myapp";} &&
hasObject {kind = "Deployment"; name = "myapp2";} &&
hasObject {kind = "Deployment"; name = "myapp2-app2";};
} {
message = "should have default labels set";
assertion =
(getObject {kind = "Deployment"; name = "myapp2-app2";})
.metadata.labels.module-label or false == "value" &&
(getObject {kind = "Deployment"; name = "myapp2";})
.metadata.labels.module-label or false == "value";
} {
message = "should passthru resources to root module";
assertion =
config.kubernetes.resources.deployments.myapp2-app2-app.metadata.labels.module-label or false == "value";
}];
};
kubernetes.version = k8sVersion;
kubernetes.defaults.all.metadata.labels.module-label = "value";
# propagate default module configuration and defaults
kubernetes.defaultModuleConfiguration = {
all.kubernetes.defaultModuleConfiguration = mkAliasDefinitions options.kubernetes.defaultModuleConfiguration;
all.kubernetes.defaults = mkAliasDefinitions options.kubernetes.defaults;
};
kubernetes.moduleDefinitions.app1.module = { config, k8s, module, ... }: {
config.kubernetes.resources.deployments.app = {
metadata.name = module.name;
spec = {
selector = {
matchLabels.app = "app";
};
template.spec = {
containers.app = {
image = "hello-world";
};
};
};
};
};
kubernetes.moduleDefinitions.app2.module = { name, config, k8s, module, ... }: {
options = {
replicas = mkOption {
description = "Number of replicas to run";
type = types.int;
default = 2;
};
};
config = {
kubernetes.resources.deployments.app = {
metadata.name = module.name;
spec = {
replicas = config.replicas;
selector = {
matchLabels.app = "app";
};
template.spec = {
containers.app = {
image = "hello-world";
};
};
};
};
kubernetes.modules.app2 = {
name = "${name}-app2";
module = "app1";
namespace = module.namespace;
};
};
};
kubernetes.modules.myapp = {
module = "app1";
namespace = "test";
};
kubernetes.modules.myapp2 = {
module = "app2";
namespace = "test";
configuration.replicas = 3;
};
}