Skip to content

Commit

Permalink
[k8s] Remove pv name at startup and replace with "useMountSourceForVo…
Browse files Browse the repository at this point in the history
…lumeName" (Azure#2621)

Fix Unit tests.
  • Loading branch information
darobs authored Mar 3, 2020
1 parent 0faecf2 commit 0858d84
Show file tree
Hide file tree
Showing 11 changed files with 58 additions and 72 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ public static class EdgeDeployment

public const string ProxyTrustBundleConfigMapEnvKey = "ProxyTrustBundleConfigMapName";

public const string PersistentVolumeNameKey = "PersistentVolumeName";
public const string UseMountSourceForVolumeNameKey = "UseMountSourceForVolumeName";

public const string StorageClassNameKey = "StorageClassName";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public class KubernetesDeploymentMapper : IKubernetesDeploymentMapper
readonly string proxyTrustBundleVolumeName;
readonly string proxyTrustBundleConfigMapName;
readonly PortMapServiceType defaultServiceType;
readonly Option<string> persistentVolumeName;
readonly bool useMountSourceForVolumeName;
readonly Option<string> storageClassName;
readonly Option<uint> persistentVolumeClaimDefaultSizeMb;
readonly string workloadApiVersion;
Expand All @@ -53,7 +53,7 @@ public KubernetesDeploymentMapper(
string proxyTrustBundleVolumeName,
string proxyTrustBundleConfigMapName,
PortMapServiceType defaultServiceType,
string persistentVolumeName,
bool useMountSourceForVolumeName,
string storageClassName,
Option<uint> persistentVolumeClaimDefaultSizeMb,
string workloadApiVersion,
Expand All @@ -74,8 +74,7 @@ public KubernetesDeploymentMapper(
this.proxyTrustBundleVolumeName = proxyTrustBundleVolumeName;
this.proxyTrustBundleConfigMapName = proxyTrustBundleConfigMapName;
this.defaultServiceType = defaultServiceType;
this.persistentVolumeName = Option.Maybe(persistentVolumeName)
.Filter(p => !string.IsNullOrWhiteSpace(p));
this.useMountSourceForVolumeName = useMountSourceForVolumeName;
this.storageClassName = Option.Maybe(storageClassName);
this.persistentVolumeClaimDefaultSizeMb = persistentVolumeClaimDefaultSizeMb;
this.workloadApiVersion = workloadApiVersion;
Expand Down Expand Up @@ -228,7 +227,7 @@ List<V1EnvVar> CollectModuleEnv(KubernetesModule module, IModuleIdentity identit
envList.Add(new V1EnvVar(KubernetesConstants.EdgeK8sObjectOwnerUidKey, module.Owner.Uid));
envList.Add(new V1EnvVar(KubernetesConstants.PortMappingServiceType, this.defaultServiceType.ToString()));
envList.Add(new V1EnvVar(KubernetesConstants.EnableK8sServiceCallTracingName, this.enableServiceCallTracing.ToString()));
this.persistentVolumeName.ForEach(pvName => envList.Add(new V1EnvVar(KubernetesConstants.PersistentVolumeNameKey, pvName)));
envList.Add(new V1EnvVar(KubernetesConstants.UseMountSourceForVolumeNameKey, this.useMountSourceForVolumeName.ToString()));
this.storageClassName.ForEach(scName => envList.Add(new V1EnvVar(KubernetesConstants.StorageClassNameKey, scName)));
this.persistentVolumeClaimDefaultSizeMb.ForEach(size => envList.Add(new V1EnvVar(KubernetesConstants.PersistentVolumeClaimDefaultSizeInMbKey, size.ToString())));
envList.AddRange(this.experimentalFeatures.Select(env => new V1EnvVar(env.Key, env.Value.ToString())));
Expand Down Expand Up @@ -361,10 +360,8 @@ static string ToProxyLogLevel(LogEventLevel level)

V1Volume GetVolume(KubernetesModule module, Mount mount)
{
// Volume name will be pvName if persistent volume is set, else will be volumeName
string volumeName = this.persistentVolumeName
.Map(KubeUtils.SanitizeK8sValue)
.GetOrElse(() => KubeUtils.SanitizeDNSValue(mount.Source));
// Volume name will be mount.Source
string volumeName = KubeUtils.SanitizeDNSValue(mount.Source);
// PVC name will be volume name
string pvcName = volumeName;

Expand All @@ -377,10 +374,8 @@ V1Volume GetVolume(KubernetesModule module, Mount mount)

V1VolumeMount GetVolumeMount(Mount mount)
{
// Volume name will be pvName if persistent volume is set, else will be volumeName
string volumeName = this.persistentVolumeName
.Map(KubeUtils.SanitizeK8sValue)
.GetOrElse(() => KubeUtils.SanitizeDNSValue(mount.Source));
// Volume name will be mount.Source
string volumeName = KubeUtils.SanitizeDNSValue(mount.Source);

return new V1VolumeMount(mount.Target, volumeName, readOnlyProperty: mount.ReadOnly);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,16 @@ namespace Microsoft.Azure.Devices.Edge.Agent.Kubernetes.EdgeDeployment.Pvc

public class KubernetesPvcMapper : IKubernetesPvcMapper
{
readonly Option<string> persistentVolumeName;
readonly bool useMountSourceForVolumeName;
readonly Option<string> storageClassName;
readonly uint persistentVolumeClaimSizeMb;

public KubernetesPvcMapper(
string persistentVolumeName,
bool useMountSourceForVolumeName,
string storageClassName,
uint persistentVolumeClaimSizeMb)
{
this.persistentVolumeName = Option.Maybe(persistentVolumeName)
.Filter(p => !string.IsNullOrWhiteSpace(p));
this.useMountSourceForVolumeName = useMountSourceForVolumeName;
this.storageClassName = Option.Maybe(storageClassName);
this.persistentVolumeClaimSizeMb = persistentVolumeClaimSizeMb;
}
Expand All @@ -38,7 +37,7 @@ bool ShouldCreatePvc(Mount mount)
return false;
}

return this.storageClassName.HasValue || this.persistentVolumeName.HasValue;
return this.storageClassName.HasValue;
}

V1PersistentVolumeClaim ExtractPvc(KubernetesModule module, Mount mount, IDictionary<string, string> labels)
Expand All @@ -58,11 +57,9 @@ V1PersistentVolumeClaim ExtractPvc(KubernetesModule module, Mount mount, IDictio
Requests = new Dictionary<string, ResourceQuantity>() { { "storage", new ResourceQuantity($"{this.persistentVolumeClaimSizeMb}Mi") } }
},
};
if (this.persistentVolumeName.HasValue)
if (this.useMountSourceForVolumeName)
{
string pvName = this.persistentVolumeName.OrDefault();
pvcName = KubeUtils.SanitizeK8sValue(pvName);
persistentVolumeClaimSpec.VolumeName = pvcName;
persistentVolumeClaimSpec.VolumeName = volumeName;
}

if (this.storageClassName.HasValue)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,7 @@ public static async Task<int> MainAsync(IConfiguration configuration)
string proxyTrustBundleConfigMapName = configuration.GetValue<string>(K8sConstants.ProxyTrustBundleConfigMapEnvKey);
PortMapServiceType mappedServiceDefault = GetDefaultServiceType(configuration);
bool enableServiceCallTracing = configuration.GetValue<bool>(K8sConstants.EnableK8sServiceCallTracingName);
string persistentVolumeName = configuration.GetValue<string>(K8sConstants.PersistentVolumeNameKey);
bool useMountSourceForVolumeName = configuration.GetValue<bool>(K8sConstants.UseMountSourceForVolumeNameKey, false);
string storageClassName = configuration.GetValue<string>(K8sConstants.StorageClassNameKey);
Option<uint> persistentVolumeClaimDefaultSizeMb = Option.Maybe(configuration.GetValue<uint?>(K8sConstants.PersistentVolumeClaimDefaultSizeInMbKey));
string deviceNamespace = configuration.GetValue<string>(K8sConstants.K8sNamespaceKey);
Expand Down Expand Up @@ -223,7 +223,7 @@ public static async Task<int> MainAsync(IConfiguration configuration)
Option.Some(productInfo),
mappedServiceDefault,
enableServiceCallTracing,
persistentVolumeName,
useMountSourceForVolumeName,
storageClassName,
persistentVolumeClaimDefaultSizeMb,
proxy,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ public class KubernetesModule : Module
readonly Option<string> productInfo;
readonly PortMapServiceType defaultMapServiceType;
readonly bool enableServiceCallTracing;
readonly string persistentVolumeName;
readonly bool useMountSourceForVolumeName;
readonly string storageClassName;
readonly Option<uint> persistentVolumeClaimSizeMb;
readonly Option<IWebProxy> proxy;
Expand Down Expand Up @@ -86,7 +86,7 @@ public KubernetesModule(
Option<string> productInfo,
PortMapServiceType defaultMapServiceType,
bool enableServiceCallTracing,
string persistentVolumeName,
bool useMountSourceForVolumeName,
string storageClassName,
Option<uint> persistentVolumeClaimSizeMb,
Option<IWebProxy> proxy,
Expand Down Expand Up @@ -117,7 +117,7 @@ public KubernetesModule(
this.productInfo = productInfo;
this.defaultMapServiceType = defaultMapServiceType;
this.enableServiceCallTracing = enableServiceCallTracing;
this.persistentVolumeName = persistentVolumeName;
this.useMountSourceForVolumeName = useMountSourceForVolumeName;
this.storageClassName = storageClassName;
this.persistentVolumeClaimSizeMb = persistentVolumeClaimSizeMb;
this.proxy = proxy;
Expand Down Expand Up @@ -256,7 +256,7 @@ protected override void Load(ContainerBuilder builder)
this.proxyTrustBundleVolumeName,
this.proxyTrustBundleConfigMapName,
this.defaultMapServiceType,
this.persistentVolumeName,
this.useMountSourceForVolumeName,
this.storageClassName,
this.persistentVolumeClaimSizeMb,
this.apiVersion,
Expand All @@ -272,7 +272,7 @@ protected override void Load(ContainerBuilder builder)
.As<IKubernetesServiceMapper>();

// KubernetesPvcMapper
builder.Register(c => new KubernetesPvcMapper(this.persistentVolumeName, this.storageClassName, this.persistentVolumeClaimSizeMb.OrDefault()))
builder.Register(c => new KubernetesPvcMapper(this.useMountSourceForVolumeName, this.storageClassName, this.persistentVolumeClaimSizeMb.OrDefault()))
.As<IKubernetesPvcMapper>();

// KubernetesServiceAccountProvider
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ public void PvcMappingForVolumeNameVolume()
var config = new KubernetesConfig("image", CreatePodParameters.Create(labels: labels, hostConfig: hostConfig), Option.None<AuthConfig>());
var docker = new DockerModule("module1", "v1", ModuleStatus.Running, RestartPolicy.Always, Config1, ImagePullPolicy.OnCreate, DefaultConfigurationInfo, EnvVarsDict);
var module = new KubernetesModule(docker, config, EdgeletModuleOwner);
var mapper = CreateMapper("a-volume", null);
var mapper = CreateMapper(true, null);

var deployment = mapper.CreateDeployment(identity, module, labels);

Expand Down Expand Up @@ -573,7 +573,7 @@ public void EdgeAgentEnvSettingsHaveLotsOfStuff()
["feature1"] = true,
["feature2"] = false
};
var mapper = CreateMapper(runAsNonRoot: true, persistentVolumeName: "pvname", storageClassName: "scname", proxyImagePullSecretName: "secret name", experimentalFeatures: features);
var mapper = CreateMapper(runAsNonRoot: true, useMountSourceForVolumeName: true, storageClassName: "scname", proxyImagePullSecretName: "secret name", experimentalFeatures: features);

var deployment = mapper.CreateDeployment(identity, module, labels);

Expand All @@ -598,15 +598,15 @@ public void EdgeAgentEnvSettingsHaveLotsOfStuff()
Assert.Equal("123", container.Env.Single(e => e.Name == KubernetesConstants.EdgeK8sObjectOwnerUidKey).Value);
Assert.Equal("ClusterIP", container.Env.Single(e => e.Name == KubernetesConstants.PortMappingServiceType).Value);
Assert.Equal("False", container.Env.Single(e => e.Name == KubernetesConstants.EnableK8sServiceCallTracingName).Value);
Assert.Equal("pvname", container.Env.Single(e => e.Name == KubernetesConstants.PersistentVolumeNameKey).Value);
Assert.Equal("True", container.Env.Single(e => e.Name == KubernetesConstants.UseMountSourceForVolumeNameKey).Value);
Assert.Equal("scname", container.Env.Single(e => e.Name == KubernetesConstants.StorageClassNameKey).Value);
Assert.Equal("100", container.Env.Single(e => e.Name == KubernetesConstants.PersistentVolumeClaimDefaultSizeInMbKey).Value);
Assert.Equal("True", container.Env.Single(e => e.Name == "feature1").Value);
Assert.Equal("False", container.Env.Single(e => e.Name == "feature2").Value);
}

static KubernetesDeploymentMapper CreateMapper(
string persistentVolumeName = "",
bool useMountSourceForVolumeName = false,
string storageClassName = "",
string proxyImagePullSecretName = null,
bool runAsNonRoot = false,
Expand All @@ -623,7 +623,7 @@ static KubernetesDeploymentMapper CreateMapper(
"trustBundleVolumeName",
"trustBundleConfigMapName",
PortMapServiceType.ClusterIP,
persistentVolumeName,
useMountSourceForVolumeName,
storageClassName,
Option.Some<uint>(100),
"apiVersion",
Expand Down
Loading

0 comments on commit 0858d84

Please sign in to comment.