github.com/GoogleCloudPlatform/terraformer@v0.8.18/terraformutils/service.go (about) 1 // Copyright 2018 The Terraformer Authors. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package terraformutils 16 17 import ( 18 "log" 19 "strings" 20 21 "github.com/GoogleCloudPlatform/terraformer/terraformutils/providerwrapper" 22 ) 23 24 type ServiceGenerator interface { 25 InitResources() error 26 GetResources() []Resource 27 SetResources(resources []Resource) 28 ParseFilter(rawFilter string) []ResourceFilter 29 ParseFilters(rawFilters []string) 30 PostConvertHook() error 31 GetArgs() map[string]interface{} 32 SetArgs(args map[string]interface{}) 33 SetName(name string) 34 SetVerbose(bool) 35 SetProviderName(name string) 36 GetProviderName() string 37 GetName() string 38 InitialCleanup() 39 PopulateIgnoreKeys(*providerwrapper.ProviderWrapper) 40 PostRefreshCleanup() 41 } 42 43 type Service struct { 44 Name string 45 Resources []Resource 46 ProviderName string 47 Args map[string]interface{} 48 Filter []ResourceFilter 49 Verbose bool 50 } 51 52 func (s *Service) SetProviderName(providerName string) { 53 s.ProviderName = providerName 54 } 55 56 func (s *Service) GetProviderName() string { 57 return s.ProviderName 58 } 59 60 func (s *Service) SetVerbose(verbose bool) { 61 s.Verbose = verbose 62 } 63 64 func (s *Service) ParseFilters(rawFilters []string) { 65 s.Filter = []ResourceFilter{} 66 for _, rawFilter := range rawFilters { 67 filters := s.ParseFilter(rawFilter) 68 s.Filter = append(s.Filter, filters...) 69 } 70 } 71 72 func (s *Service) ParseFilter(rawFilter string) []ResourceFilter { 73 var filters []ResourceFilter 74 if !strings.HasPrefix(rawFilter, "Name=") && len(strings.Split(rawFilter, "=")) == 2 { 75 parts := strings.Split(rawFilter, "=") 76 serviceName, resourcesID := parts[0], parts[1] 77 filters = append(filters, ResourceFilter{ 78 ServiceName: serviceName, 79 FieldPath: "id", 80 AcceptableValues: ParseFilterValues(resourcesID), 81 }) 82 } else { 83 parts := strings.Split(rawFilter, ";") 84 if !((len(parts) == 1 && strings.HasPrefix(rawFilter, "Name=")) || len(parts) == 2 || len(parts) == 3) { 85 log.Print("Invalid filter: " + rawFilter) 86 return filters 87 } 88 var ServiceNamePart string 89 var FieldPathPart string 90 var AcceptableValuesPart string 91 switch len(parts) { 92 case 1: 93 ServiceNamePart = "" 94 FieldPathPart = parts[0] 95 AcceptableValuesPart = "" 96 case 2: 97 ServiceNamePart = "" 98 FieldPathPart = parts[0] 99 AcceptableValuesPart = parts[1] 100 default: 101 ServiceNamePart = strings.TrimPrefix(parts[0], "Type=") 102 FieldPathPart = parts[1] 103 AcceptableValuesPart = parts[2] 104 } 105 106 filters = append(filters, ResourceFilter{ 107 ServiceName: ServiceNamePart, 108 FieldPath: strings.TrimPrefix(FieldPathPart, "Name="), 109 AcceptableValues: ParseFilterValues(strings.TrimPrefix(AcceptableValuesPart, "Value=")), 110 }) 111 } 112 return filters 113 } 114 115 func (s *Service) SetName(name string) { 116 s.Name = name 117 } 118 func (s *Service) GetName() string { 119 return s.Name 120 } 121 122 func (s *Service) InitialCleanup() { 123 FilterCleanup(s, true) 124 } 125 126 func (s *Service) PostRefreshCleanup() { 127 if len(s.Filter) != 0 { 128 FilterCleanup(s, false) 129 } 130 } 131 132 func (s *Service) GetArgs() map[string]interface{} { 133 return s.Args 134 } 135 func (s *Service) SetArgs(args map[string]interface{}) { 136 s.Args = args 137 } 138 139 func (s *Service) GetResources() []Resource { 140 return s.Resources 141 } 142 func (s *Service) SetResources(resources []Resource) { 143 s.Resources = resources 144 } 145 146 func (s *Service) InitResources() error { 147 panic("implement me") 148 } 149 150 func (s *Service) PostConvertHook() error { 151 return nil 152 } 153 154 func (s *Service) PopulateIgnoreKeys(providerWrapper *providerwrapper.ProviderWrapper) { 155 var resourcesTypes []string 156 for _, r := range s.Resources { 157 resourcesTypes = append(resourcesTypes, r.InstanceInfo.Type) 158 } 159 keys := IgnoreKeys(resourcesTypes, providerWrapper) 160 for k, v := range keys { 161 for i := range s.Resources { 162 if s.Resources[i].InstanceInfo.Type == k { 163 s.Resources[i].IgnoreKeys = append(s.Resources[i].IgnoreKeys, v...) 164 } 165 } 166 } 167 }