github.com/turbot/steampipe@v1.7.0-rc.0.0.20240517123944-7cef272d4458/pkg/dashboard/dashboardevents/dashboard_changed.go (about)

     1  package dashboardevents
     2  
     3  import (
     4  	"github.com/turbot/steampipe/pkg/steampipeconfig/modconfig"
     5  )
     6  
     7  type DashboardChanged struct {
     8  	ChangedDashboards  []*modconfig.DashboardTreeItemDiffs
     9  	ChangedContainers  []*modconfig.DashboardTreeItemDiffs
    10  	ChangedControls    []*modconfig.DashboardTreeItemDiffs
    11  	ChangedBenchmarks  []*modconfig.DashboardTreeItemDiffs
    12  	ChangedCategories  []*modconfig.DashboardTreeItemDiffs
    13  	ChangedCards       []*modconfig.DashboardTreeItemDiffs
    14  	ChangedCharts      []*modconfig.DashboardTreeItemDiffs
    15  	ChangedFlows       []*modconfig.DashboardTreeItemDiffs
    16  	ChangedGraphs      []*modconfig.DashboardTreeItemDiffs
    17  	ChangedHierarchies []*modconfig.DashboardTreeItemDiffs
    18  	ChangedImages      []*modconfig.DashboardTreeItemDiffs
    19  	ChangedInputs      []*modconfig.DashboardTreeItemDiffs
    20  	ChangedTables      []*modconfig.DashboardTreeItemDiffs
    21  	ChangedTexts       []*modconfig.DashboardTreeItemDiffs
    22  	ChangedNodes       []*modconfig.DashboardTreeItemDiffs
    23  	ChangedEdges       []*modconfig.DashboardTreeItemDiffs
    24  
    25  	NewDashboards  []*modconfig.Dashboard
    26  	NewContainers  []*modconfig.DashboardContainer
    27  	NewControls    []*modconfig.Control
    28  	NewBenchmarks  []*modconfig.Benchmark
    29  	NewCards       []*modconfig.DashboardCard
    30  	NewCategories  []*modconfig.DashboardCategory
    31  	NewCharts      []*modconfig.DashboardChart
    32  	NewFlows       []*modconfig.DashboardFlow
    33  	NewGraphs      []*modconfig.DashboardGraph
    34  	NewHierarchies []*modconfig.DashboardHierarchy
    35  	NewImages      []*modconfig.DashboardImage
    36  	NewInputs      []*modconfig.DashboardInput
    37  	NewTables      []*modconfig.DashboardTable
    38  	NewTexts       []*modconfig.DashboardText
    39  	NewNodes       []*modconfig.DashboardNode
    40  	NewEdges       []*modconfig.DashboardEdge
    41  
    42  	DeletedDashboards  []*modconfig.Dashboard
    43  	DeletedContainers  []*modconfig.DashboardContainer
    44  	DeletedControls    []*modconfig.Control
    45  	DeletedBenchmarks  []*modconfig.Benchmark
    46  	DeletedCards       []*modconfig.DashboardCard
    47  	DeletedCategories  []*modconfig.DashboardCategory
    48  	DeletedCharts      []*modconfig.DashboardChart
    49  	DeletedFlows       []*modconfig.DashboardFlow
    50  	DeletedGraphs      []*modconfig.DashboardGraph
    51  	DeletedHierarchies []*modconfig.DashboardHierarchy
    52  	DeletedImages      []*modconfig.DashboardImage
    53  	DeletedInputs      []*modconfig.DashboardInput
    54  	DeletedTables      []*modconfig.DashboardTable
    55  	DeletedTexts       []*modconfig.DashboardText
    56  	DeletedNodes       []*modconfig.DashboardNode
    57  	DeletedEdges       []*modconfig.DashboardEdge
    58  }
    59  
    60  // IsDashboardEvent implements DashboardEvent interface
    61  func (*DashboardChanged) IsDashboardEvent() {}
    62  
    63  func (c *DashboardChanged) HasChanges() bool {
    64  	return len(c.ChangedDashboards)+
    65  		len(c.ChangedContainers)+
    66  		len(c.ChangedBenchmarks)+
    67  		len(c.ChangedControls)+
    68  		len(c.ChangedCards)+
    69  		len(c.ChangedCategories)+
    70  		len(c.ChangedCharts)+
    71  		len(c.ChangedFlows)+
    72  		len(c.ChangedGraphs)+
    73  		len(c.ChangedHierarchies)+
    74  		len(c.ChangedImages)+
    75  		len(c.ChangedInputs)+
    76  		len(c.ChangedTables)+
    77  		len(c.ChangedTexts)+
    78  		len(c.ChangedNodes)+
    79  		len(c.ChangedEdges)+
    80  		len(c.NewDashboards)+
    81  		len(c.NewContainers)+
    82  		len(c.NewBenchmarks)+
    83  		len(c.NewControls)+
    84  		len(c.NewCards)+
    85  		len(c.NewCategories)+
    86  		len(c.NewCharts)+
    87  		len(c.NewFlows)+
    88  		len(c.NewGraphs)+
    89  		len(c.NewHierarchies)+
    90  		len(c.NewImages)+
    91  		len(c.NewInputs)+
    92  		len(c.NewTables)+
    93  		len(c.NewTexts)+
    94  		len(c.NewNodes)+
    95  		len(c.NewEdges)+
    96  		len(c.DeletedDashboards)+
    97  		len(c.DeletedContainers)+
    98  		len(c.DeletedBenchmarks)+
    99  		len(c.DeletedControls)+
   100  		len(c.DeletedCards)+
   101  		len(c.DeletedCategories)+
   102  		len(c.DeletedCharts)+
   103  		len(c.DeletedFlows)+
   104  		len(c.DeletedGraphs)+
   105  		len(c.DeletedHierarchies)+
   106  		len(c.DeletedImages)+
   107  		len(c.DeletedInputs)+
   108  		len(c.DeletedTables)+
   109  		len(c.DeletedTexts)+
   110  		len(c.DeletedNodes)+
   111  		len(c.DeletedEdges) > 0
   112  }
   113  
   114  func (c *DashboardChanged) WalkChangedResources(resourceFunc func(item modconfig.ModTreeItem) (bool, error)) error {
   115  	for _, r := range c.ChangedDashboards {
   116  		if continueWalking, err := resourceFunc(r.Item); err != nil || !continueWalking {
   117  			return err
   118  		}
   119  	}
   120  	for _, r := range c.ChangedContainers {
   121  		if continueWalking, err := resourceFunc(r.Item); err != nil || !continueWalking {
   122  			return err
   123  		}
   124  	}
   125  	for _, r := range c.ChangedControls {
   126  		if continueWalking, err := resourceFunc(r.Item); err != nil || !continueWalking {
   127  			return err
   128  		}
   129  	}
   130  	for _, r := range c.ChangedCards {
   131  		if continueWalking, err := resourceFunc(r.Item); err != nil || !continueWalking {
   132  			return err
   133  		}
   134  	}
   135  	for _, r := range c.ChangedCategories {
   136  		if continueWalking, err := resourceFunc(r.Item); err != nil || !continueWalking {
   137  			return err
   138  		}
   139  	}
   140  	for _, r := range c.ChangedCharts {
   141  		if continueWalking, err := resourceFunc(r.Item); err != nil || !continueWalking {
   142  			return err
   143  		}
   144  	}
   145  	for _, r := range c.ChangedFlows {
   146  		if continueWalking, err := resourceFunc(r.Item); err != nil || !continueWalking {
   147  			return err
   148  		}
   149  	}
   150  	for _, r := range c.ChangedGraphs {
   151  		if continueWalking, err := resourceFunc(r.Item); err != nil || !continueWalking {
   152  			return err
   153  		}
   154  	}
   155  	for _, r := range c.ChangedHierarchies {
   156  		if continueWalking, err := resourceFunc(r.Item); err != nil || !continueWalking {
   157  			return err
   158  		}
   159  	}
   160  	for _, r := range c.ChangedImages {
   161  		if continueWalking, err := resourceFunc(r.Item); err != nil || !continueWalking {
   162  			return err
   163  		}
   164  	}
   165  	for _, r := range c.ChangedInputs {
   166  		if continueWalking, err := resourceFunc(r.Item); err != nil || !continueWalking {
   167  			return err
   168  		}
   169  	}
   170  	for _, r := range c.ChangedTables {
   171  		if continueWalking, err := resourceFunc(r.Item); err != nil || !continueWalking {
   172  			return err
   173  		}
   174  	}
   175  	for _, r := range c.ChangedTexts {
   176  		if continueWalking, err := resourceFunc(r.Item); err != nil || !continueWalking {
   177  			return err
   178  		}
   179  	}
   180  	for _, r := range c.NewDashboards {
   181  		if continueWalking, err := resourceFunc(r); err != nil || !continueWalking {
   182  			return err
   183  		}
   184  	}
   185  	for _, r := range c.NewContainers {
   186  		if continueWalking, err := resourceFunc(r); err != nil || !continueWalking {
   187  			return err
   188  		}
   189  	}
   190  	for _, r := range c.NewControls {
   191  		if continueWalking, err := resourceFunc(r); err != nil || !continueWalking {
   192  			return err
   193  		}
   194  	}
   195  	for _, r := range c.NewCards {
   196  		if continueWalking, err := resourceFunc(r); err != nil || !continueWalking {
   197  			return err
   198  		}
   199  	}
   200  	for _, r := range c.NewCategories {
   201  		if continueWalking, err := resourceFunc(r); err != nil || !continueWalking {
   202  			return err
   203  		}
   204  	}
   205  	for _, r := range c.NewCharts {
   206  		if continueWalking, err := resourceFunc(r); err != nil || !continueWalking {
   207  			return err
   208  		}
   209  	}
   210  	for _, r := range c.NewFlows {
   211  		if continueWalking, err := resourceFunc(r); err != nil || !continueWalking {
   212  			return err
   213  		}
   214  	}
   215  	for _, r := range c.NewGraphs {
   216  		if continueWalking, err := resourceFunc(r); err != nil || !continueWalking {
   217  			return err
   218  		}
   219  	}
   220  	for _, r := range c.NewHierarchies {
   221  		if continueWalking, err := resourceFunc(r); err != nil || !continueWalking {
   222  			return err
   223  		}
   224  	}
   225  	for _, r := range c.NewImages {
   226  		if continueWalking, err := resourceFunc(r); err != nil || !continueWalking {
   227  			return err
   228  		}
   229  	}
   230  	for _, r := range c.NewInputs {
   231  		if continueWalking, err := resourceFunc(r); err != nil || !continueWalking {
   232  			return err
   233  		}
   234  	}
   235  	for _, r := range c.NewTables {
   236  		if continueWalking, err := resourceFunc(r); err != nil || !continueWalking {
   237  			return err
   238  		}
   239  	}
   240  	for _, r := range c.NewTexts {
   241  		if continueWalking, err := resourceFunc(r); err != nil || !continueWalking {
   242  			return err
   243  		}
   244  	}
   245  	for _, r := range c.DeletedContainers {
   246  		if continueWalking, err := resourceFunc(r); err != nil || !continueWalking {
   247  			return err
   248  		}
   249  	}
   250  	for _, r := range c.DeletedControls {
   251  		if continueWalking, err := resourceFunc(r); err != nil || !continueWalking {
   252  			return err
   253  		}
   254  	}
   255  	for _, r := range c.DeletedCards {
   256  		if continueWalking, err := resourceFunc(r); err != nil || !continueWalking {
   257  			return err
   258  		}
   259  	}
   260  	for _, r := range c.DeletedCategories {
   261  		if continueWalking, err := resourceFunc(r); err != nil || !continueWalking {
   262  			return err
   263  		}
   264  	}
   265  	for _, r := range c.DeletedCharts {
   266  		if continueWalking, err := resourceFunc(r); err != nil || !continueWalking {
   267  			return err
   268  		}
   269  	}
   270  	for _, r := range c.DeletedFlows {
   271  		if continueWalking, err := resourceFunc(r); err != nil || !continueWalking {
   272  			return err
   273  		}
   274  	}
   275  	for _, r := range c.DeletedGraphs {
   276  		if continueWalking, err := resourceFunc(r); err != nil || !continueWalking {
   277  			return err
   278  		}
   279  	}
   280  	for _, r := range c.DeletedHierarchies {
   281  		if continueWalking, err := resourceFunc(r); err != nil || !continueWalking {
   282  			return err
   283  		}
   284  	}
   285  	for _, r := range c.DeletedImages {
   286  		if continueWalking, err := resourceFunc(r); err != nil || !continueWalking {
   287  			return err
   288  		}
   289  	}
   290  	for _, r := range c.DeletedInputs {
   291  		if continueWalking, err := resourceFunc(r); err != nil || !continueWalking {
   292  			return err
   293  		}
   294  	}
   295  	for _, r := range c.DeletedTables {
   296  		if continueWalking, err := resourceFunc(r); err != nil || !continueWalking {
   297  			return err
   298  		}
   299  	}
   300  	for _, r := range c.DeletedTexts {
   301  		if continueWalking, err := resourceFunc(r); err != nil || !continueWalking {
   302  			return err
   303  		}
   304  	}
   305  
   306  	return nil
   307  }
   308  
   309  func (c *DashboardChanged) SetParentsChanged(item modconfig.ModTreeItem, prevResourceMaps *modconfig.ResourceMaps) {
   310  	if prevResourceMaps == nil {
   311  		return
   312  	}
   313  
   314  	parents := item.GetParents()
   315  	for _, parent := range parents {
   316  		// if the parent DID NOT exist in the previous resource maps, do nothing
   317  		parsedResourceName, _ := modconfig.ParseResourceName(parent.Name())
   318  		if _, existingResource := prevResourceMaps.GetResource(parsedResourceName); existingResource {
   319  			c.AddChanged(parent)
   320  			c.SetParentsChanged(parent, prevResourceMaps)
   321  		}
   322  	}
   323  }
   324  
   325  func (c *DashboardChanged) diffsContain(diffs []*modconfig.DashboardTreeItemDiffs, item modconfig.ModTreeItem) bool {
   326  	for _, d := range diffs {
   327  		if d.Item.Name() == item.Name() {
   328  			return true
   329  		}
   330  	}
   331  	return false
   332  }
   333  
   334  func (c *DashboardChanged) AddChanged(item modconfig.ModTreeItem) {
   335  	diff := &modconfig.DashboardTreeItemDiffs{
   336  		Name:              item.Name(),
   337  		Item:              item,
   338  		ChangedProperties: []string{"Children"},
   339  	}
   340  	switch item.(type) {
   341  	case *modconfig.Dashboard:
   342  		if !c.diffsContain(c.ChangedDashboards, item) {
   343  			c.ChangedDashboards = append(c.ChangedDashboards, diff)
   344  		}
   345  	case *modconfig.DashboardContainer:
   346  		if !c.diffsContain(c.ChangedContainers, item) {
   347  			c.ChangedContainers = append(c.ChangedContainers, diff)
   348  		}
   349  	case *modconfig.Control:
   350  		if !c.diffsContain(c.ChangedControls, item) {
   351  			c.ChangedControls = append(c.ChangedControls, diff)
   352  		}
   353  	case *modconfig.Benchmark:
   354  		if !c.diffsContain(c.ChangedBenchmarks, item) {
   355  			c.ChangedBenchmarks = append(c.ChangedBenchmarks, diff)
   356  		}
   357  	case *modconfig.DashboardCard:
   358  		if !c.diffsContain(c.ChangedCards, item) {
   359  			c.ChangedCards = append(c.ChangedCards, diff)
   360  		}
   361  	case *modconfig.DashboardCategory:
   362  		if !c.diffsContain(c.ChangedCategories, item) {
   363  			c.ChangedCategories = append(c.ChangedCategories, diff)
   364  		}
   365  	case *modconfig.DashboardChart:
   366  		if !c.diffsContain(c.ChangedCharts, item) {
   367  			c.ChangedCharts = append(c.ChangedCharts, diff)
   368  		}
   369  	case *modconfig.DashboardHierarchy:
   370  		if !c.diffsContain(c.ChangedHierarchies, item) {
   371  			c.ChangedHierarchies = append(c.ChangedHierarchies, diff)
   372  		}
   373  
   374  	case *modconfig.DashboardImage:
   375  		if !c.diffsContain(c.ChangedImages, item) {
   376  			c.ChangedImages = append(c.ChangedImages, diff)
   377  		}
   378  
   379  	case *modconfig.DashboardInput:
   380  		if !c.diffsContain(c.ChangedInputs, item) {
   381  			c.ChangedInputs = append(c.ChangedInputs, diff)
   382  		}
   383  
   384  	case *modconfig.DashboardTable:
   385  		if !c.diffsContain(c.ChangedTables, item) {
   386  			c.ChangedTables = append(c.ChangedTables, diff)
   387  		}
   388  	case *modconfig.DashboardText:
   389  		if !c.diffsContain(c.ChangedTexts, item) {
   390  			c.ChangedTexts = append(c.ChangedTexts, diff)
   391  		}
   392  	}
   393  }