Skip to content

Commit

Permalink
Support windows agent configmap for mutateAntreaConfigMap
Browse files Browse the repository at this point in the history
Currently mutateAntreaConfigMap can only support linux agent configmap.
This patch will support windows configmap processing.

issue antrea-io#3826

Signed-off-by: Shuyang Xin <gavinx@vmware.com>
  • Loading branch information
XinShuYang committed May 29, 2022
1 parent b2fb032 commit fd2f35d
Showing 1 changed file with 60 additions and 18 deletions.
78 changes: 60 additions & 18 deletions test/e2e/framework.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ const (
kubeNamespace string = "kube-system"
flowAggregatorNamespace string = "flow-aggregator"
antreaConfigVolume string = "antrea-config"
antreaWindowsConfigVolume string = "antrea-windows-config"
flowAggregatorConfigVolume string = "flow-aggregator-config"
antreaDaemonSet string = "antrea-agent"
antreaWindowsDaemonSet string = "antrea-agent-windows"
Expand Down Expand Up @@ -1969,6 +1970,28 @@ func GetControllerFeatures() (featuregate.FeatureGate, error) {
return getFeatures(antreaControllerConfName)
}

func (data *TestData) GetAntreaWindowsConfigMap(antreaNamespace string) (*corev1.ConfigMap, error) {
daemonset, err := data.clientset.AppsV1().DaemonSets(antreaNamespace).Get(context.TODO(), antreaWindowsDaemonSet, metav1.GetOptions{})
if err != nil {
return nil, fmt.Errorf("failed to retrieve Antrea Windows DaemonSet: %v", err)
}
var configMapName string
for _, volume := range daemonset.Spec.Template.Spec.Volumes {
if volume.ConfigMap != nil && volume.Name == antreaWindowsConfigVolume {
configMapName = volume.ConfigMap.Name
break
}
}
if len(configMapName) == 0 {
return nil, fmt.Errorf("failed to locate Windows %s ConfigMap volume", antreaWindowsConfigVolume)
}
configMap, err := data.clientset.CoreV1().ConfigMaps(antreaNamespace).Get(context.TODO(), configMapName, metav1.GetOptions{})
if err != nil {
return nil, fmt.Errorf("failed to get Windows ConfigMap %s: %v", configMapName, err)
}
return configMap, nil
}

func (data *TestData) GetAntreaConfigMap(antreaNamespace string) (*corev1.ConfigMap, error) {
deployment, err := data.clientset.AppsV1().Deployments(antreaNamespace).Get(context.TODO(), antreaDeployment, metav1.GetOptions{})
if err != nil {
Expand Down Expand Up @@ -2041,6 +2064,16 @@ func (data *TestData) mutateAntreaConfigMap(
restartController bool,
restartAgent bool,
) error {
includeWindowsAgent := false
var antreaWindowsConfigMap *corev1.ConfigMap
if len(clusterInfo.windowsNodes) != 0 {
var err error
includeWindowsAgent = true
antreaWindowsConfigMap, err = data.GetAntreaWindowsConfigMap(antreaNamespace)
if err != nil {
return err
}
}
configMap, err := data.GetAntreaConfigMap(antreaNamespace)
if err != nil {
return err
Expand Down Expand Up @@ -2082,10 +2115,10 @@ func (data *TestData) mutateAntreaConfigMap(
}
configMap.Data["antrea-controller.conf"] = string(b)
}

getAgentConf := func() (*agentconfig.AgentConfig, error) {
//getAgentConf should be able to process both windows and linux configmap.
getAgentConf := func(cm *corev1.ConfigMap) (*agentconfig.AgentConfig, error) {
var agentConf agentconfig.AgentConfig
if err := yaml.Unmarshal([]byte(configMap.Data["antrea-agent.conf"]), &agentConf); err != nil {
if err := yaml.Unmarshal([]byte(cm.Data["antrea-agent.conf"]), &agentConf); err != nil {
return nil, fmt.Errorf("failed to unmarshal Agent config from ConfigMap: %v", err)
}
// as a convenience, we initialize the FeatureGates map if it is nil
Expand All @@ -2096,34 +2129,43 @@ func (data *TestData) mutateAntreaConfigMap(
}

agentConfChanged := false
agentConfigMaps := []*corev1.ConfigMap{configMap}
if agentChanges != nil {
agentConfIn, err := getAgentConf()
if err != nil {
return err
}
agentConfOut, err := getAgentConf()
if err != nil {
return err
if includeWindowsAgent {
agentConfigMaps = append(agentConfigMaps, antreaWindowsConfigMap)
}
for _, cm := range agentConfigMaps {
agentConfIn, err := getAgentConf(cm)
if err != nil {
return err
}
agentConfOut, err := getAgentConf(cm)
if err != nil {
return err
}

agentChanges(agentConfOut)
agentConfChanged = !reflect.DeepEqual(agentConfIn, agentConfOut)
agentChanges(agentConfOut)
agentConfChanged = !reflect.DeepEqual(agentConfIn, agentConfOut)

b, err := yaml.Marshal(agentConfOut)
if err != nil {
return fmt.Errorf("failed to marshal Agent config: %v", err)
b, err := yaml.Marshal(agentConfOut)
if err != nil {
return fmt.Errorf("failed to marshal Agent config: %v", err)
}
cm.Data["antrea-agent.conf"] = string(b)
}
configMap.Data["antrea-agent.conf"] = string(b)
}

if !agentConfChanged && !controllerConfChanged {
// no config was changed, no need to call Update or restart anything
return nil
}

if _, err := data.clientset.CoreV1().ConfigMaps(antreaNamespace).Update(context.TODO(), configMap, metav1.UpdateOptions{}); err != nil {
return fmt.Errorf("failed to update ConfigMap %s: %v", configMap.Name, err)
for _, cm := range agentConfigMaps {
if _, err := data.clientset.CoreV1().ConfigMaps(antreaNamespace).Update(context.TODO(), cm, metav1.UpdateOptions{}); err != nil {
return fmt.Errorf("failed to update ConfigMap %s: %v", cm.Name, err)
}
}

if restartAgent && agentConfChanged {
err = data.restartAntreaAgentPods(defaultTimeout)
if err != nil {
Expand Down

0 comments on commit fd2f35d

Please sign in to comment.