fakekms/resource_names.go (91 lines of code) (raw):

// Copyright 2021 Google LLC // // Licensed 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 fakekms import ( "fmt" "regexp" ) const idPattern = "[a-zA-Z0-9_-]{1,63}" var ( idRegexp = regexp.MustCompile(fmt.Sprintf("^%s$", idPattern)) locationRegexp = regexp.MustCompile("^projects/([^/]+)/locations/([^/]+)$") keyRingRegexp = regexp.MustCompile(fmt.Sprintf("^(.*)/keyRings/(%s)$", idPattern)) cryptoKeyRegexp = regexp.MustCompile(fmt.Sprintf("^(.*)/cryptoKeys/(%s)$", idPattern)) cryptoKeyVersionRegexp = regexp.MustCompile(fmt.Sprintf("^(.*)/cryptoKeyVersions/(%s)$", idPattern)) ) // checkID returns InvalidArgument if the provided ID does not comply with the KMS // ID naming rules. func checkID(id string) error { if !idRegexp.MatchString(id) { return errInvalidArgument("invalid id: %s", id) } return nil } type locationName struct { ProjectID, LocationID string } func parseLocationName(name string) (locationName, error) { if m := locationRegexp.FindStringSubmatch(name); m != nil { return locationName{ProjectID: m[1], LocationID: m[2]}, nil } return locationName{}, errMalformedName("location", name) } func (n locationName) Project() string { return fmt.Sprintf("projects/%s", n.ProjectID) } func (n locationName) Location() string { return fmt.Sprintf("projects/%s/locations/%s", n.ProjectID, n.LocationID) } func (n locationName) String() string { return n.Location() } type keyRingName struct { locationName KeyRingID string } func parseKeyRingName(name string) (keyRingName, error) { if m := keyRingRegexp.FindStringSubmatch(name); m != nil { if loc, err := parseLocationName(m[1]); err == nil { return keyRingName{locationName: loc, KeyRingID: m[2]}, nil } } return keyRingName{}, errMalformedName("key ring", name) } func (n keyRingName) KeyRing() string { return fmt.Sprintf("%s/keyRings/%s", n.Location(), n.KeyRingID) } func (n keyRingName) String() string { return n.KeyRing() } type cryptoKeyName struct { keyRingName CryptoKeyID string } func parseCryptoKeyName(name string) (cryptoKeyName, error) { if m := cryptoKeyRegexp.FindStringSubmatch(name); m != nil { if kr, err := parseKeyRingName(m[1]); err == nil { return cryptoKeyName{keyRingName: kr, CryptoKeyID: m[2]}, nil } } return cryptoKeyName{}, errMalformedName("crypto key", name) } func (n cryptoKeyName) CryptoKey() string { return fmt.Sprintf("%s/cryptoKeys/%s", n.KeyRing(), n.CryptoKeyID) } func (n cryptoKeyName) String() string { return n.CryptoKey() } type cryptoKeyVersionName struct { cryptoKeyName CryptoKeyVersionID string } func parseCryptoKeyVersionName(name string) (cryptoKeyVersionName, error) { if m := cryptoKeyVersionRegexp.FindStringSubmatch(name); m != nil { if ck, err := parseCryptoKeyName(m[1]); err == nil { return cryptoKeyVersionName{cryptoKeyName: ck, CryptoKeyVersionID: m[2]}, nil } } return cryptoKeyVersionName{}, errMalformedName("crypto key version", name) } func (n cryptoKeyVersionName) CryptoKeyVersion() string { return fmt.Sprintf("%s/cryptoKeyVersions/%s", n.CryptoKey(), n.CryptoKeyVersionID) } func (n cryptoKeyVersionName) String() string { return n.CryptoKeyVersion() }