tui/pre_processors.go (240 lines of code) (raw):
// Copyright 2023 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 tui
import (
"fmt"
"strings"
"github.com/GoogleCloudPlatform/deploystack/config"
"github.com/GoogleCloudPlatform/deploystack/gcloud"
"github.com/charmbracelet/bubbles/list"
tea "github.com/charmbracelet/bubbletea"
)
func getProjects(q *Queue) tea.Cmd {
return func() tea.Msg {
p, err := q.client.ProjectList()
if err != nil {
return errMsg{err: err}
}
items := []list.Item{}
for _, v := range p {
if !v.BillingEnabled {
label := fmt.Sprintf("%s (Billing Diabled)", v.Name)
items = append(items, item{value: v.ID, label: billingDisabledStyle.Render(label)})
continue
}
items = append(items, item{
value: strings.TrimSpace(v.ID),
label: strings.TrimSpace(v.Name),
})
}
return items
}
}
func getBillingAccounts(q *Queue) tea.Cmd {
return func() tea.Msg {
p, err := q.client.BillingAccountList()
if err != nil {
return errMsg{err: err}
}
items := []list.Item{}
for _, v := range p {
id := strings.ReplaceAll(v.Name, "billingAccounts/", "")
items = append(items, item{
value: strings.TrimSpace(id),
label: strings.TrimSpace(v.DisplayName),
})
}
// If there is only 1 billing account, don't bother the user with
// setting it up.
if len(items) == 1 {
ba := strings.ReplaceAll(p[0].Name, "billingAccounts/", "")
key := strings.ReplaceAll(q.currentKey(), billNewSuffix, "")
project := q.stack.GetSetting(key)
if err := q.client.BillingAccountAttach(project, ba); err != nil {
return errMsg{err: fmt.Errorf("attachBilling: could not attach billing to project: %w", err)}
}
return successMsg{}
}
return items
}
}
func getRegions(q *Queue) tea.Cmd {
return func() tea.Msg {
s := q.stack
project := s.GetSetting("project_id")
product := s.Config.RegionType
p, err := q.client.RegionList(project, product)
if err != nil {
return errMsg{err: err}
}
items := []list.Item{}
for _, v := range p {
items = append(items, item{
value: strings.TrimSpace(v),
label: strings.TrimSpace(v),
})
}
return items
}
}
func handleReports(q *Queue) tea.Cmd {
return func() tea.Msg {
reports := q.Get("reports").([]config.Report)
items := []list.Item{}
for _, v := range reports {
items = append(items, item{
value: strings.TrimSpace(v.WD),
label: strings.TrimSpace(v.Config.Title),
})
}
return items
}
}
func getZones(q *Queue) tea.Cmd {
return func() tea.Msg {
s := q.stack
project := s.GetSetting("project_id")
region := s.GetSetting("region")
p, err := q.client.ZoneList(project, region)
if err != nil {
return errMsg{err: err}
}
items := []list.Item{}
for _, v := range p {
items = append(items, item{
value: strings.TrimSpace(v),
label: strings.TrimSpace(v),
})
}
return items
}
}
func getMachineTypeFamilies(q *Queue) tea.Cmd {
return func() tea.Msg {
s := q.stack
project := s.GetSetting("project_id")
zone := s.GetSetting("zone")
types, err := q.client.MachineTypeList(project, zone)
if err != nil {
return errMsg{err: err}
}
typefamilies := q.client.MachineTypeFamilyList(types)
items := []list.Item{}
for _, v := range typefamilies {
items = append(items, item{
value: strings.TrimSpace(v.Value),
label: strings.TrimSpace(v.Label),
})
}
return items
}
}
func getMachineTypes(q *Queue) tea.Cmd {
return func() tea.Msg {
s := q.stack
project := s.GetSetting("project_id")
zone := s.GetSetting("zone")
family := s.GetSetting("instance-machine-type-family")
types, err := q.client.MachineTypeList(project, zone)
if err != nil {
return errMsg{err: err}
}
filteredtypes := q.client.MachineTypeListByFamily(types, family)
items := []list.Item{}
for _, v := range filteredtypes {
items = append(items, item{
value: strings.TrimSpace(v.Value),
label: strings.TrimSpace(v.Label),
})
}
return items
}
}
func getDiskProjects(q *Queue) tea.Cmd {
return func() tea.Msg {
diskImages := gcloud.DiskProjects
items := []list.Item{}
for _, v := range diskImages {
items = append(items, item{
value: strings.TrimSpace(v.Value),
label: strings.TrimSpace(v.Label),
})
}
return items
}
}
func getImageFamilies(q *Queue) tea.Cmd {
return func() tea.Msg {
s := q.stack
instanceImageProject := s.GetSetting("instance-image-project")
project := s.GetSetting("project_id")
images, err := q.client.ImageList(project, instanceImageProject)
if err != nil {
return errMsg{err: err}
}
families := q.client.ImageFamilyList(images)
items := []list.Item{}
for _, v := range families {
items = append(items, item{
value: strings.TrimSpace(v.Value),
label: strings.TrimSpace(v.Label),
})
}
return items
}
}
func getImageDisks(q *Queue) tea.Cmd {
return func() tea.Msg {
s := q.stack
instanceImageProject := s.GetSetting("instance-image-project")
instanceImageFamily := s.GetSetting("instance-image-family")
project := s.GetSetting("project_id")
images, err := q.client.ImageList(project, instanceImageProject)
if err != nil {
return errMsg{err: err}
}
imagesByFam := q.client.ImageTypeListByFamily(images, instanceImageProject, instanceImageFamily)
items := []list.Item{}
for _, v := range imagesByFam {
items = append(items, item{
value: strings.TrimSpace(v.Value),
label: strings.TrimSpace(v.Label),
})
}
return items
}
}
func getDiskTypes(q *Queue) tea.Cmd {
return func() tea.Msg {
items := []list.Item{
item{"Standard", "pd-standard"},
item{"Balanced", "pd-balanced"},
item{"SSD", "pd-sdd"},
}
return items
}
}
func getYesOrNo(q *Queue) tea.Cmd {
return func() tea.Msg {
items := []list.Item{
item{"Yes", "y"},
item{"No", "n"},
}
return items
}
}
func getNoOrYes(q *Queue) tea.Cmd {
return func() tea.Msg {
items := []list.Item{
item{"No", "n"},
item{"Yes", "y"},
}
return items
}
}
func cleanUp(q *Queue) tea.Cmd {
return func() tea.Msg {
// // Don't let these get leaked to terraform
q.stack.DeleteSetting("domain_consent")
billingPageSettings := q.stack.Settings.Search(billNewSuffix)
for _, v := range billingPageSettings {
q.stack.DeleteSetting(v.Name)
}
return ""
}
}