diff --git a/pkg/webhook/admission/conversion.go b/pkg/webhook/admission/conversion.go index 96cb67e..a448c01 100644 --- a/pkg/webhook/admission/conversion.go +++ b/pkg/webhook/admission/conversion.go @@ -3,7 +3,9 @@ package admission import ( "encoding/json" "fmt" + "log" "net/http" + "strings" "github.com/go-logr/logr" "github.com/isaaguilar/terraform-operator/pkg/webhook/admission/convert" @@ -32,31 +34,47 @@ func (c ConversionWebhook) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - convertReview.Response = c.converter(convertReview.Request) - w.WriteHeader(http.StatusOK) + response, status := c.converter(convertReview.Request) + convertReview.Response = response + w.WriteHeader(status) + if status == 200 { + log.Printf("Successfully converted resource(s): %s", objectNames(convertReview)) + } else { + log.Printf("Failed to convert resource(s) %s: %s", objectNames(convertReview), response.Result.Status) + } b, _ := json.Marshal(convertReview) w.Write(b) } +func objectNames(review *apiextensionsv1.ConversionReview) string { + names := []string{} + for _, obj := range review.Response.ConvertedObjects { + unstructured := unstructuredv1.Unstructured{} + err := json.Unmarshal(obj.Raw, &unstructured) + if err == nil { + names = append(names, unstructured.GetName()) + } + } + return strings.Join(names, ",") +} + // helper to construct error response. -func errored(uid types.UID, err error) *apiextensionsv1.ConversionResponse { +func errored(uid types.UID, err error) (*apiextensionsv1.ConversionResponse, int) { return &apiextensionsv1.ConversionResponse{ UID: uid, Result: metav1.Status{ Status: metav1.StatusFailure, Message: err.Error(), }, - } + }, http.StatusBadRequest } // Takes a conversionRequest and always returns a conversionResponse. -func (c ConversionWebhook) converter(request *apiextensionsv1.ConversionRequest) *apiextensionsv1.ConversionResponse { - +func (c ConversionWebhook) converter(request *apiextensionsv1.ConversionRequest) (*apiextensionsv1.ConversionResponse, int) { desiredAPIVersion := request.DesiredAPIVersion if desiredAPIVersion == "" { return errored(request.UID, fmt.Errorf("conversion request did not have a desired api version")) } - responseObjects := make([]runtime.RawExtension, len(request.Objects)) for i, obj := range request.Objects { unstructured := unstructuredv1.Unstructured{} @@ -109,5 +127,5 @@ func (c ConversionWebhook) converter(request *apiextensionsv1.ConversionRequest) Result: metav1.Status{ Status: metav1.StatusSuccess, }, - } + }, http.StatusOK } diff --git a/pkg/webhook/admission/convert/v1alpha1_to_v1alpha2.go b/pkg/webhook/admission/convert/v1alpha1_to_v1alpha2.go index bab7f01..755553a 100644 --- a/pkg/webhook/admission/convert/v1alpha1_to_v1alpha2.go +++ b/pkg/webhook/admission/convert/v1alpha1_to_v1alpha2.go @@ -43,6 +43,10 @@ func ConvertV1alpha1ToV1alpha2(rawRequest []byte) ([]byte, runtime.Object, error want.Spec.OutputsToOmit = have.Spec.OutputsToOmit want.Spec.ServiceAccount = have.Spec.ServiceAccount + if storageClassName, ok := have.Annotations["v1alpha2.tf.isaaguilar.com/storageClassName"]; ok { + want.Spec.StorageClassName = &storageClassName + } + scriptImageConfig := convertImageConfig("script", have.Spec.ScriptRunner, have.Spec.ScriptRunnerVersion, have.Spec.ScriptRunnerPullPolicy) terraformImageConfig := convertImageConfig("terraform", have.Spec.TerraformRunner, "", have.Spec.TerraformRunnerPullPolicy) setupImageConfig := convertImageConfig("setup", have.Spec.SetupRunner, have.Spec.SetupRunnerVersion, have.Spec.SetupRunnerPullPolicy) diff --git a/pkg/webhook/admission/convert/v1alpha2_to_v1alpha1.go b/pkg/webhook/admission/convert/v1alpha2_to_v1alpha1.go index 7c72ec2..59d0d40 100644 --- a/pkg/webhook/admission/convert/v1alpha2_to_v1alpha1.go +++ b/pkg/webhook/admission/convert/v1alpha2_to_v1alpha1.go @@ -76,6 +76,13 @@ func ConvertV1alpha2ToV1alpha1(rawRequest []byte) ([]byte, runtime.Object, error want.Spec.OutputsToOmit = have.Spec.OutputsToOmit want.Spec.ServiceAccount = have.Spec.ServiceAccount + if have.Spec.StorageClassName != nil { + if want.Annotations == nil { + want.Annotations = map[string]string{} + } + want.Annotations["v1alpha2.tf.isaaguilar.com/storageClassName"] = *have.Spec.StorageClassName + } + if have.Spec.Images != nil { if have.Spec.Images.Script != nil { image := ""