in pkg/admission/admission_controller.go [558:617]
func (c *AdmissionController) validateConfigMap(namespace string, cm *v1.ConfigMap) error {
if namespace != c.conf.GetNamespace() {
log.Log(log.Admission).Debug("Configmap does not belong to YuniKorn", zap.String("namespace", namespace), zap.String("Name", cm.Name))
return nil
}
configMaps := c.conf.GetConfigMaps()
switch cm.Name {
case constants.DefaultConfigMapName:
configMaps[0] = cm
case constants.ConfigMapName:
configMaps[1] = cm
default:
log.Log(log.Admission).Debug("Configmap does not belong to YuniKorn", zap.String("namespace", namespace), zap.String("Name", cm.Name))
return nil
}
configs := schedulerconf.FlattenConfigMaps(configMaps)
policyGroup := conf.GetPendingPolicyGroup(configs)
confKey := fmt.Sprintf("%s.yaml", policyGroup)
content, ok := configs[confKey]
if !ok {
log.Log(log.Admission).Info("Configmap missing policygroup config, using default", zap.String("entry", confKey))
content = ""
}
checksum := fmt.Sprintf("%X", sha256.Sum256([]byte(content)))
log.Log(log.Admission).Info("Validating YuniKorn configuration", zap.String("checksum", checksum))
log.Log(log.Admission).Debug("Configmap data", zap.ByteString("content", []byte(content)))
response, err := http.Post(fmt.Sprintf(schedulerValidateConfURLPattern, c.conf.GetSchedulerServiceAddress()), "application/json", bytes.NewBuffer([]byte(content)))
if err != nil {
log.Log(log.Admission).Error("YuniKorn scheduler is unreachable, assuming configmap is valid", zap.Error(err))
return nil
}
defer response.Body.Close()
if response.StatusCode < 200 || response.StatusCode > 299 {
log.Log(log.Admission).Error("YuniKorn scheduler responded with unexpected status, assuming configmap is valid",
zap.Int("status", response.StatusCode))
return nil
}
responseBytes, err := io.ReadAll(response.Body)
if err != nil {
log.Log(log.Admission).Error("Unable to read response from YuniKorn scheduler, assuming configmap is valid", zap.Error(err))
return nil
}
var responseData ValidateConfResponse
if err = json.Unmarshal(responseBytes, &responseData); err != nil {
log.Log(log.Admission).Error("Unable to parse response from YuniKorn scheduler, assuming configmap is valid", zap.Error(err))
return nil
}
if !responseData.Allowed {
err = fmt.Errorf(responseData.Reason)
log.Log(log.Admission).Error("Configmap validation failed, aborting", zap.Error(err))
return err
}
log.Log(log.Admission).Info("Successfully validated YuniKorn configuration")
return nil
}