terraformutils/service.go (135 lines of code) (raw):
// Copyright 2018 The Terraformer Authors.
//
// 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 terraformutils
import (
"log"
"strings"
"github.com/GoogleCloudPlatform/terraformer/terraformutils/providerwrapper"
)
type ServiceGenerator interface {
InitResources() error
GetResources() []Resource
SetResources(resources []Resource)
ParseFilter(rawFilter string) []ResourceFilter
ParseFilters(rawFilters []string)
PostConvertHook() error
GetArgs() map[string]interface{}
SetArgs(args map[string]interface{})
SetName(name string)
SetVerbose(bool)
SetProviderName(name string)
GetProviderName() string
GetName() string
InitialCleanup()
PopulateIgnoreKeys(*providerwrapper.ProviderWrapper)
PostRefreshCleanup()
}
type Service struct {
Name string
Resources []Resource
ProviderName string
Args map[string]interface{}
Filter []ResourceFilter
Verbose bool
}
func (s *Service) SetProviderName(providerName string) {
s.ProviderName = providerName
}
func (s *Service) GetProviderName() string {
return s.ProviderName
}
func (s *Service) SetVerbose(verbose bool) {
s.Verbose = verbose
}
func (s *Service) ParseFilters(rawFilters []string) {
s.Filter = []ResourceFilter{}
for _, rawFilter := range rawFilters {
filters := s.ParseFilter(rawFilter)
s.Filter = append(s.Filter, filters...)
}
}
func (s *Service) ParseFilter(rawFilter string) []ResourceFilter {
var filters []ResourceFilter
if !strings.HasPrefix(rawFilter, "Name=") && len(strings.Split(rawFilter, "=")) == 2 {
parts := strings.Split(rawFilter, "=")
serviceName, resourcesID := parts[0], parts[1]
filters = append(filters, ResourceFilter{
ServiceName: serviceName,
FieldPath: "id",
AcceptableValues: ParseFilterValues(resourcesID),
})
} else {
parts := strings.Split(rawFilter, ";")
if !((len(parts) == 1 && strings.HasPrefix(rawFilter, "Name=")) || len(parts) == 2 || len(parts) == 3) {
log.Print("Invalid filter: " + rawFilter)
return filters
}
var ServiceNamePart string
var FieldPathPart string
var AcceptableValuesPart string
switch len(parts) {
case 1:
ServiceNamePart = ""
FieldPathPart = parts[0]
AcceptableValuesPart = ""
case 2:
ServiceNamePart = ""
FieldPathPart = parts[0]
AcceptableValuesPart = parts[1]
default:
ServiceNamePart = strings.TrimPrefix(parts[0], "Type=")
FieldPathPart = parts[1]
AcceptableValuesPart = parts[2]
}
filters = append(filters, ResourceFilter{
ServiceName: ServiceNamePart,
FieldPath: strings.TrimPrefix(FieldPathPart, "Name="),
AcceptableValues: ParseFilterValues(strings.TrimPrefix(AcceptableValuesPart, "Value=")),
})
}
return filters
}
func (s *Service) SetName(name string) {
s.Name = name
}
func (s *Service) GetName() string {
return s.Name
}
func (s *Service) InitialCleanup() {
FilterCleanup(s, true)
}
func (s *Service) PostRefreshCleanup() {
if len(s.Filter) != 0 {
FilterCleanup(s, false)
}
}
func (s *Service) GetArgs() map[string]interface{} {
return s.Args
}
func (s *Service) SetArgs(args map[string]interface{}) {
s.Args = args
}
func (s *Service) GetResources() []Resource {
return s.Resources
}
func (s *Service) SetResources(resources []Resource) {
s.Resources = resources
}
func (s *Service) InitResources() error {
panic("implement me")
}
func (s *Service) PostConvertHook() error {
return nil
}
func (s *Service) PopulateIgnoreKeys(providerWrapper *providerwrapper.ProviderWrapper) {
var resourcesTypes []string
for _, r := range s.Resources {
resourcesTypes = append(resourcesTypes, r.InstanceInfo.Type)
}
keys := IgnoreKeys(resourcesTypes, providerWrapper)
for k, v := range keys {
for i := range s.Resources {
if s.Resources[i].InstanceInfo.Type == k {
s.Resources[i].IgnoreKeys = append(s.Resources[i].IgnoreKeys, v...)
}
}
}
}