github.com/GoogleCloudPlatform/deploystack@v1.12.8/tui/pre_processors.go (about) 1 // Copyright 2023 Google LLC 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 tui 16 17 import ( 18 "fmt" 19 "strings" 20 21 "github.com/GoogleCloudPlatform/deploystack/config" 22 "github.com/GoogleCloudPlatform/deploystack/gcloud" 23 "github.com/charmbracelet/bubbles/list" 24 tea "github.com/charmbracelet/bubbletea" 25 ) 26 27 func getProjects(q *Queue) tea.Cmd { 28 return func() tea.Msg { 29 p, err := q.client.ProjectList() 30 if err != nil { 31 return errMsg{err: err} 32 } 33 34 items := []list.Item{} 35 for _, v := range p { 36 if !v.BillingEnabled { 37 label := fmt.Sprintf("%s (Billing Diabled)", v.Name) 38 items = append(items, item{value: v.ID, label: billingDisabledStyle.Render(label)}) 39 continue 40 } 41 items = append(items, item{ 42 value: strings.TrimSpace(v.ID), 43 label: strings.TrimSpace(v.Name), 44 }) 45 } 46 47 return items 48 } 49 } 50 51 func getBillingAccounts(q *Queue) tea.Cmd { 52 return func() tea.Msg { 53 p, err := q.client.BillingAccountList() 54 if err != nil { 55 return errMsg{err: err} 56 } 57 58 items := []list.Item{} 59 for _, v := range p { 60 id := strings.ReplaceAll(v.Name, "billingAccounts/", "") 61 items = append(items, item{ 62 value: strings.TrimSpace(id), 63 label: strings.TrimSpace(v.DisplayName), 64 }) 65 } 66 67 // If there is only 1 billing account, don't bother the user with 68 // setting it up. 69 if len(items) == 1 { 70 ba := strings.ReplaceAll(p[0].Name, "billingAccounts/", "") 71 72 key := strings.ReplaceAll(q.currentKey(), billNewSuffix, "") 73 project := q.stack.GetSetting(key) 74 if err := q.client.BillingAccountAttach(project, ba); err != nil { 75 return errMsg{err: fmt.Errorf("attachBilling: could not attach billing to project: %w", err)} 76 } 77 return successMsg{} 78 } 79 80 return items 81 } 82 } 83 84 func getRegions(q *Queue) tea.Cmd { 85 return func() tea.Msg { 86 s := q.stack 87 project := s.GetSetting("project_id") 88 product := s.Config.RegionType 89 90 p, err := q.client.RegionList(project, product) 91 if err != nil { 92 return errMsg{err: err} 93 } 94 95 items := []list.Item{} 96 for _, v := range p { 97 items = append(items, item{ 98 value: strings.TrimSpace(v), 99 label: strings.TrimSpace(v), 100 }) 101 } 102 103 return items 104 } 105 } 106 107 func handleReports(q *Queue) tea.Cmd { 108 return func() tea.Msg { 109 reports := q.Get("reports").([]config.Report) 110 111 items := []list.Item{} 112 for _, v := range reports { 113 114 items = append(items, item{ 115 value: strings.TrimSpace(v.WD), 116 label: strings.TrimSpace(v.Config.Title), 117 }) 118 } 119 120 return items 121 } 122 } 123 124 func getZones(q *Queue) tea.Cmd { 125 return func() tea.Msg { 126 s := q.stack 127 project := s.GetSetting("project_id") 128 region := s.GetSetting("region") 129 130 p, err := q.client.ZoneList(project, region) 131 if err != nil { 132 return errMsg{err: err} 133 } 134 135 items := []list.Item{} 136 for _, v := range p { 137 items = append(items, item{ 138 value: strings.TrimSpace(v), 139 label: strings.TrimSpace(v), 140 }) 141 } 142 143 return items 144 } 145 } 146 147 func getMachineTypeFamilies(q *Queue) tea.Cmd { 148 return func() tea.Msg { 149 s := q.stack 150 project := s.GetSetting("project_id") 151 zone := s.GetSetting("zone") 152 153 types, err := q.client.MachineTypeList(project, zone) 154 if err != nil { 155 return errMsg{err: err} 156 } 157 158 typefamilies := q.client.MachineTypeFamilyList(types) 159 160 items := []list.Item{} 161 for _, v := range typefamilies { 162 items = append(items, item{ 163 value: strings.TrimSpace(v.Value), 164 label: strings.TrimSpace(v.Label), 165 }) 166 } 167 168 return items 169 } 170 } 171 172 func getMachineTypes(q *Queue) tea.Cmd { 173 return func() tea.Msg { 174 s := q.stack 175 project := s.GetSetting("project_id") 176 zone := s.GetSetting("zone") 177 family := s.GetSetting("instance-machine-type-family") 178 179 types, err := q.client.MachineTypeList(project, zone) 180 if err != nil { 181 return errMsg{err: err} 182 } 183 184 filteredtypes := q.client.MachineTypeListByFamily(types, family) 185 186 items := []list.Item{} 187 for _, v := range filteredtypes { 188 items = append(items, item{ 189 value: strings.TrimSpace(v.Value), 190 label: strings.TrimSpace(v.Label), 191 }) 192 } 193 194 return items 195 } 196 } 197 198 func getDiskProjects(q *Queue) tea.Cmd { 199 return func() tea.Msg { 200 diskImages := gcloud.DiskProjects 201 202 items := []list.Item{} 203 for _, v := range diskImages { 204 items = append(items, item{ 205 value: strings.TrimSpace(v.Value), 206 label: strings.TrimSpace(v.Label), 207 }) 208 } 209 210 return items 211 } 212 } 213 214 func getImageFamilies(q *Queue) tea.Cmd { 215 return func() tea.Msg { 216 s := q.stack 217 instanceImageProject := s.GetSetting("instance-image-project") 218 project := s.GetSetting("project_id") 219 220 images, err := q.client.ImageList(project, instanceImageProject) 221 if err != nil { 222 return errMsg{err: err} 223 } 224 225 families := q.client.ImageFamilyList(images) 226 227 items := []list.Item{} 228 for _, v := range families { 229 items = append(items, item{ 230 value: strings.TrimSpace(v.Value), 231 label: strings.TrimSpace(v.Label), 232 }) 233 } 234 235 return items 236 } 237 } 238 239 func getImageDisks(q *Queue) tea.Cmd { 240 return func() tea.Msg { 241 s := q.stack 242 instanceImageProject := s.GetSetting("instance-image-project") 243 instanceImageFamily := s.GetSetting("instance-image-family") 244 project := s.GetSetting("project_id") 245 246 images, err := q.client.ImageList(project, instanceImageProject) 247 if err != nil { 248 return errMsg{err: err} 249 } 250 251 imagesByFam := q.client.ImageTypeListByFamily(images, instanceImageProject, instanceImageFamily) 252 253 items := []list.Item{} 254 for _, v := range imagesByFam { 255 items = append(items, item{ 256 value: strings.TrimSpace(v.Value), 257 label: strings.TrimSpace(v.Label), 258 }) 259 } 260 261 return items 262 } 263 } 264 265 func getDiskTypes(q *Queue) tea.Cmd { 266 return func() tea.Msg { 267 items := []list.Item{ 268 item{"Standard", "pd-standard"}, 269 item{"Balanced", "pd-balanced"}, 270 item{"SSD", "pd-sdd"}, 271 } 272 273 return items 274 } 275 } 276 277 func getYesOrNo(q *Queue) tea.Cmd { 278 return func() tea.Msg { 279 items := []list.Item{ 280 item{"Yes", "y"}, 281 item{"No", "n"}, 282 } 283 284 return items 285 } 286 } 287 288 func getNoOrYes(q *Queue) tea.Cmd { 289 return func() tea.Msg { 290 items := []list.Item{ 291 item{"No", "n"}, 292 item{"Yes", "y"}, 293 } 294 295 return items 296 } 297 } 298 299 func cleanUp(q *Queue) tea.Cmd { 300 return func() tea.Msg { 301 // // Don't let these get leaked to terraform 302 q.stack.DeleteSetting("domain_consent") 303 304 billingPageSettings := q.stack.Settings.Search(billNewSuffix) 305 306 for _, v := range billingPageSettings { 307 q.stack.DeleteSetting(v.Name) 308 309 } 310 311 return "" 312 } 313 }