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  }