pkg/cso/v1/pack.go (99 lines of code) (raw):
// Licensed to Elasticsearch B.V. under one or more contributor
// license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright
// ownership. Elasticsearch B.V. licenses this file to you under
// the Apache License, Version 2.0 (the "License"); you may
// not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
package v1
import (
"fmt"
"strings"
csov1 "github.com/elastic/harp/api/gen/go/cso/v1"
)
type ringPacker func([]string) *csov1.Secret
var packMap = map[string]ringPacker{ringMeta: packMeta, ringInfra: packInfra, ringPlatform: packPlatform, ringProduct: packProduct, ringApp: packApplication, ringArtifact: packArtifact}
// Pack a secret path to a protobuf object.
func Pack(secretPath string) (*csov1.Secret, error) {
// Validate secret path first
if err := Validate(secretPath); err != nil {
return nil, fmt.Errorf("unable to pack cso secret: %w", err)
}
// Clean path first
cleanPath := Clean(secretPath)
// Split path using '/'
parts := strings.Split(cleanPath, "/")
// Delegate to ring packer
rp, ok := packMap[parts[0]]
if !ok {
return nil, fmt.Errorf("unable to pack unknown secret '%s'", parts[0])
}
// Call ring packer
res := rp(parts)
// No error
return res, nil
}
// -----------------------------------------------------------------------------
func packMeta(parts []string) *csov1.Secret {
return &csov1.Secret{
RingLevel: csov1.RingLevel_RING_LEVEL_META,
Path: &csov1.Secret_Meta{
Meta: &csov1.Meta{
Key: strings.Join(parts[1:], "/"),
},
},
}
}
func packInfra(parts []string) *csov1.Secret {
return &csov1.Secret{
RingLevel: csov1.RingLevel_RING_LEVEL_INFRASTRUCTURE,
Path: &csov1.Secret_Infrastructure{
Infrastructure: &csov1.Infrastructure{
CloudProvider: parts[1],
AccountId: parts[2],
Region: parts[3],
ServiceName: parts[4],
Key: strings.Join(parts[5:], "/"),
},
},
}
}
func packPlatform(parts []string) *csov1.Secret {
return &csov1.Secret{
RingLevel: csov1.RingLevel_RING_LEVEL_PLATFORM,
Path: &csov1.Secret_Platform{
Platform: &csov1.Platform{
Stage: FromStageName(parts[1]),
Name: parts[2],
Region: parts[3],
ServiceName: parts[4],
Key: strings.Join(parts[5:], "/"),
},
},
}
}
func packProduct(parts []string) *csov1.Secret {
return &csov1.Secret{
RingLevel: csov1.RingLevel_RING_LEVEL_PRODUCT,
Path: &csov1.Secret_Product{
Product: &csov1.Product{
Name: parts[1],
Version: parts[2],
ComponentName: parts[3],
Key: strings.Join(parts[4:], "/"),
},
},
}
}
func packApplication(parts []string) *csov1.Secret {
return &csov1.Secret{
RingLevel: csov1.RingLevel_RING_LEVEL_APPLICATION,
Path: &csov1.Secret_Application{
Application: &csov1.Application{
Stage: FromStageName(parts[1]),
PlatformName: parts[2],
ProductName: parts[3],
ProductVersion: parts[4],
ComponentName: parts[5],
Key: strings.Join(parts[6:], "/"),
},
},
}
}
func packArtifact(parts []string) *csov1.Secret {
return &csov1.Secret{
RingLevel: csov1.RingLevel_RING_LEVEL_ARTIFACT,
Path: &csov1.Secret_Artifact{
Artifact: &csov1.Artifact{
Type: parts[1],
Id: parts[2],
Key: strings.Join(parts[3:], "/"),
},
},
}
}