Skip to content

Commit

Permalink
Merge branch 'laverya/redact-spec-api' of github.com:replicatedhq/kot…
Browse files Browse the repository at this point in the history
…s into jelena-redactors
  • Loading branch information
jgruica committed May 22, 2020
2 parents f0b37cc + 7144a13 commit 790990d
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 175 deletions.
6 changes: 2 additions & 4 deletions kotsadm/pkg/apiserver/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,10 +75,8 @@ func Start() {
r.Path("/api/v1/redact/set").Methods("OPTIONS", "PUT").HandlerFunc(handlers.UpdateRedact)
r.Path("/api/v1/redact/get").Methods("OPTIONS", "GET").HandlerFunc(handlers.GetRedact)
r.Path("/api/v1/redacts").Methods("OPTIONS", "GET").HandlerFunc(handlers.ListRedactors)
r.Path("/api/v1/redact/metadata/{slug}").Methods("OPTIONS", "GET").HandlerFunc(handlers.GetRedactMetadata)
r.Path("/api/v1/redact/metadata/{slug}").Methods("POST").HandlerFunc(handlers.SetRedactMetadata)
r.Path("/api/v1/redact/spec/{slug}").Methods("OPTIONS", "GET").HandlerFunc(handlers.GetRedactYaml)
r.Path("/api/v1/redact/spec/{slug}").Methods("POST").HandlerFunc(handlers.SetRedactYaml)
r.Path("/api/v1/redact/spec/{slug}").Methods("OPTIONS", "GET").HandlerFunc(handlers.GetRedactMetadataAndYaml)
r.Path("/api/v1/redact/spec/{slug}").Methods("POST").HandlerFunc(handlers.SetRedactMetadataAndYaml)
r.Path("/api/v1/redact/spec/{slug}").Methods("DELETE").HandlerFunc(handlers.DeleteRedact)

r.PathPrefix("/api/v1/kots/").Methods("OPTIONS").HandlerFunc(handlers.CORS)
Expand Down
131 changes: 19 additions & 112 deletions kotsadm/pkg/handlers/redact.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,8 @@ type GetRedactResponse struct {
}

type GetRedactorResponse struct {
Redactor string `json:"redactor"`
Redactor string `json:"redactor"`
Metadata redact.RedactorList `json:"redactorMetadata"`

Success bool `json:"success"`
Error string `json:"error,omitempty"`
Expand All @@ -47,13 +48,8 @@ type PostRedactorMetadata struct {
Name string `json:"name"`
Enabled bool `json:"enabled"`
Description string `json:"description"`
}

type RedactorMetadataResponse struct {
Redactor redact.RedactorList `json:"redactor"`

Success bool `json:"success"`
Error string `json:"error,omitempty"`
New bool `json:"new"`
Redactor string `json:"redactor"`
}

func UpdateRedact(w http.ResponseWriter, r *http.Request) {
Expand Down Expand Up @@ -188,51 +184,7 @@ func GetRedact(w http.ResponseWriter, r *http.Request) {
JSON(w, 200, getRedactResponse)
}

func GetRedactMetadata(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Access-Control-Allow-Origin", "*")
w.Header().Set("Access-Control-Allow-Headers", "content-type, origin, accept, authorization")

if r.Method == "OPTIONS" {
w.WriteHeader(200)
return
}

getMetadataResponse := RedactorMetadataResponse{
Success: false,
}

sess, err := session.Parse(r.Header.Get("Authorization"))
if err != nil {
logger.Error(err)
getMetadataResponse.Error = "failed to parse authorization header"
JSON(w, 401, getMetadataResponse)
return
}

// we don't currently have roles, all valid tokens are valid sessions
if sess == nil || sess.ID == "" {
getMetadataResponse.Error = "no session in auth header"
JSON(w, 401, getMetadataResponse)
return
}

redactorSlug := mux.Vars(r)["slug"]

redactorObj, err := redact.GetRedactBySlug(redactorSlug)
if err != nil {
logger.Error(err)
getMetadataResponse.Error = "failed to get redactor"
JSON(w, http.StatusInternalServerError, getMetadataResponse)
return
}

getMetadataResponse.Success = true
getMetadataResponse.Redactor = redactorObj.Metadata
JSON(w, http.StatusOK, getMetadataResponse)
return
}

func GetRedactYaml(w http.ResponseWriter, r *http.Request) {
func GetRedactMetadataAndYaml(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Access-Control-Allow-Origin", "*")
w.Header().Set("Access-Control-Allow-Headers", "content-type, origin, accept, authorization")

Expand Down Expand Up @@ -280,6 +232,7 @@ func GetRedactYaml(w http.ResponseWriter, r *http.Request) {

getRedactorResponse.Success = true
getRedactorResponse.Redactor = string(marshalled)
getRedactorResponse.Metadata = redactorObj.Metadata
JSON(w, http.StatusOK, getRedactorResponse)
return
}
Expand Down Expand Up @@ -326,11 +279,11 @@ func ListRedactors(w http.ResponseWriter, r *http.Request) {
return
}

func SetRedactMetadata(w http.ResponseWriter, r *http.Request) {
func SetRedactMetadataAndYaml(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Access-Control-Allow-Origin", "*")
w.Header().Set("Access-Control-Allow-Headers", "content-type, origin, accept, authorization")

metadataResponse := RedactorMetadataResponse{
metadataResponse := GetRedactorResponse{
Success: false,
}

Expand All @@ -351,80 +304,34 @@ func SetRedactMetadata(w http.ResponseWriter, r *http.Request) {

redactorSlug := mux.Vars(r)["slug"]

updateMetadataRequest := PostRedactorMetadata{}
if err := json.NewDecoder(r.Body).Decode(&updateMetadataRequest); err != nil {
updateRedactRequest := PostRedactorMetadata{}
if err := json.NewDecoder(r.Body).Decode(&updateRedactRequest); err != nil {
logger.Error(err)
metadataResponse.Error = "failed to decode request body"
JSON(w, 400, metadataResponse)
return
}

newMetadata, err := redact.SetRedactMetadata(updateMetadataRequest.Name, redactorSlug, updateMetadataRequest.Description, updateMetadataRequest.Enabled)
newRedactor, err := redact.SetRedactYaml(updateRedactRequest.Name, redactorSlug, updateRedactRequest.Description, updateRedactRequest.Enabled, updateRedactRequest.New, []byte(updateRedactRequest.Redactor))
if err != nil {
logger.Error(err)
metadataResponse.Error = "failed to update metadata"
metadataResponse.Error = "failed to update redactor"
JSON(w, 400, metadataResponse)
return
}

metadataResponse.Success = true
metadataResponse.Redactor = *newMetadata
JSON(w, http.StatusOK, metadataResponse)
return
}

func SetRedactYaml(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Access-Control-Allow-Origin", "*")
w.Header().Set("Access-Control-Allow-Headers", "content-type, origin, accept, authorization")

setYamlResponse := RedactorMetadataResponse{
Success: false,
}

sess, err := session.Parse(r.Header.Get("Authorization"))
marshalled, err := util.MarshalIndent(2, newRedactor.Redact)
if err != nil {
logger.Error(err)
setYamlResponse.Error = "failed to parse authorization header"
JSON(w, 401, setYamlResponse)
return
}

// we don't currently have roles, all valid tokens are valid sessions
if sess == nil || sess.ID == "" {
setYamlResponse.Error = "no session in auth header"
JSON(w, 401, setYamlResponse)
metadataResponse.Error = "failed to marshal redactor"
JSON(w, http.StatusInternalServerError, metadataResponse)
return
}

redactorSlug := mux.Vars(r)["slug"]

updateMetadataRequest := PostRedactorMetadata{}
if err := json.NewDecoder(r.Body).Decode(&updateMetadataRequest); err != nil {
logger.Error(err)
setYamlResponse.Error = "failed to decode request body"
JSON(w, 400, setYamlResponse)
return
}

body, err := ioutil.ReadAll(r.Body)
if err != nil {
logger.Error(err)
setYamlResponse.Error = "failed to read body"
JSON(w, 500, setYamlResponse)
return
}

updatedRedactor, err := redact.SetRedactYaml(redactorSlug, body)
if err != nil {
logger.Error(err)
setYamlResponse.Error = "failed to update metadata"
JSON(w, 400, setYamlResponse)
return
}

setYamlResponse.Success = true
setYamlResponse.Redactor = *updatedRedactor
JSON(w, http.StatusOK, setYamlResponse)
metadataResponse.Success = true
metadataResponse.Metadata = newRedactor.Metadata
metadataResponse.Redactor = string(marshalled)
JSON(w, http.StatusOK, metadataResponse)
return
}

Expand Down
88 changes: 29 additions & 59 deletions kotsadm/pkg/redact/redact.go
Original file line number Diff line number Diff line change
Expand Up @@ -160,51 +160,8 @@ func SetRedactSpec(spec string) (string, error) {
return "", nil
}

func SetRedactMetadata(name, slug, description string, enabled bool) (*RedactorList, error) {
configMap, _, err := getConfigmap()
if err != nil {
return nil, err
}

redactString, ok := configMap.Data[slug]
if !ok {
return nil, fmt.Errorf("slug %s not found", slug)
}

redactorEntry := RedactorMetadata{}
err = json.Unmarshal([]byte(redactString), &redactorEntry)
if err != nil {
return nil, errors.Wrapf(err, "unable to parse redactor %s", slug)
}

redactorEntry.Metadata.Updated = time.Now()
redactorEntry.Metadata.Description = description
redactorEntry.Metadata.Enabled = enabled
redactorEntry.Metadata.Name = name

if slug != getSlug(name) && name != "" {
// changing name
delete(configMap.Data, slug)
slug = getSlug(name)
redactorEntry.Metadata.Slug = slug
redactorEntry.Metadata.Name = name
}

jsonBytes, err := json.Marshal(redactorEntry)
if err != nil {
return nil, errors.Wrapf(err, "unable to marshal redactor %s", name)
}

configMap.Data[slug] = string(jsonBytes)

_, err = writeConfigmap(configMap)
if err != nil {
return nil, errors.Wrapf(err, "write configMap with updated metadata")
}
return &redactorEntry.Metadata, nil
}

func SetRedactYaml(slug string, yamlBytes []byte) (*RedactorList, error) {
// updates/creates an individual redact with the provided metadata and yaml
func SetRedactYaml(name, slug, description string, enabled, newRedact bool, yamlBytes []byte) (*RedactorMetadata, error) {
// parse yaml as redactor
newRedactorSpec := v1beta1.Redact{}
err := yaml.Unmarshal(yamlBytes, &newRedactorSpec)
Expand All @@ -219,27 +176,36 @@ func SetRedactYaml(slug string, yamlBytes []byte) (*RedactorList, error) {

redactorEntry := RedactorMetadata{}
redactString, ok := configMap.Data[slug]
if !ok {
// new redactor
redactorEntry.Metadata = RedactorList{
Name: getSlug(newRedactorSpec.Name),
Slug: slug,
Created: time.Now(),
Updated: time.Now(),
Enabled: true,
Description: "",
}
if redactorEntry.Metadata.Name == "" {
if !ok || newRedact {
// if name is not set in yaml or the request, take the name from the slug
// if name is set, create the slug from the name
if newRedactorSpec.Name == "" && name == "" {
newRedactorSpec.Name = slug
redactorEntry.Metadata.Name = slug
} else {
// name in request overrides name in yaml
if name != "" {
newRedactorSpec.Name = name
}
slug = getSlug(newRedactorSpec.Name)
}

// create the new redactor
redactorEntry.Metadata = RedactorList{
Name: newRedactorSpec.Name,
Slug: slug,
Created: time.Now(),
}
} else {
// unmarshal existing redactor, check if name changed
err = json.Unmarshal([]byte(redactString), &redactorEntry)
if err != nil {
return nil, errors.Wrapf(err, "unable to parse redactor %s", slug)
}
redactorEntry.Metadata.Updated = time.Now()

// name in request overrides name in spec
if name != newRedactorSpec.Name && name != "" {
newRedactorSpec.Name = name
}

if slug != getSlug(newRedactorSpec.Name) && newRedactorSpec.Name != "" {
// changing name
Expand All @@ -255,6 +221,10 @@ func SetRedactYaml(slug string, yamlBytes []byte) (*RedactorList, error) {
}
}

redactorEntry.Metadata.Enabled = enabled
redactorEntry.Metadata.Description = description
redactorEntry.Metadata.Updated = time.Now()

redactorEntry.Redact = newRedactorSpec

jsonBytes, err := json.Marshal(redactorEntry)
Expand All @@ -268,7 +238,7 @@ func SetRedactYaml(slug string, yamlBytes []byte) (*RedactorList, error) {
if err != nil {
return nil, errors.Wrapf(err, "write configMap with updated redact")
}
return &redactorEntry.Metadata, nil
return &redactorEntry, nil
}

func DeleteRedact(slug string) error {
Expand Down

0 comments on commit 790990d

Please sign in to comment.