cloud/digitalocean/droplet/model.go
func (m *Model) Resources() map[int]cloud.Resource {
	if len(m.cachedResources) > 0 {
		return m.cachedResources
	}
	r := make(map[int]cloud.Resource)
	i := 0

	// ---- [SSH Key] ----
	r[i] = &resources.SSH{
		Shared: resources.Shared{
			Name: m.known.Name,
		},
	}
	i++

	machineConfigs := m.known.MachineProviderConfigs()
	for _, machineConfig := range machineConfigs {
		serverPool := machineConfig.ServerPool
		// ---- [Droplet] ----
		r[i] = &resources.Droplet{
			Shared: resources.Shared{
				Name: serverPool.Name,
			},
			ServerPool: serverPool,
		}
		i++
	}

	for _, machineConfig := range machineConfigs {
		serverPool := machineConfig.ServerPool
		for _, firewall := range serverPool.Firewalls {
			// ---- [Firewall] ----
			f := &resources.Firewall{
				Shared: resources.Shared{
					Name:    serverPool.Name,
					CloudID: firewall.Identifier,
				},
				Tags:       []string{serverPool.Name},
				ServerPool: serverPool,
			}

			for _, rule := range firewall.IngressRules {
				var src *resources.Sources
				if _, _, err := net.ParseCIDR(rule.IngressSource); err == nil {
					src = &resources.Sources{
						Addresses: []string{rule.IngressSource},
					}
				} else if ip := net.ParseIP(rule.IngressSource); ip != nil {
					src = &resources.Sources{
						Addresses: []string{rule.IngressSource},
					}
				} else {
					src = &resources.Sources{
						Tags: []string{rule.IngressSource},
					}
				}

				InboundRule := resources.InboundRule{
					Protocol:  rule.IngressProtocol,
					PortRange: rule.IngressToPort,
					Source:    src,
				}
				f.InboundRules = append(f.InboundRules, InboundRule)
			}
			for _, rule := range firewall.EgressRules {
				var dest *resources.Destinations
				if _, _, err := net.ParseCIDR(rule.EgressDestination); err == nil {
					dest = &resources.Destinations{
						Addresses: []string{rule.EgressDestination},
					}
				} else if ip := net.ParseIP(rule.EgressDestination); ip != nil {
					dest = &resources.Destinations{
						Addresses: []string{rule.EgressDestination},
					}
				} else {
					dest = &resources.Destinations{
						Tags: []string{rule.EgressDestination},
					}
				}

				OutboundRule := resources.OutboundRule{
					Protocol:     rule.EgressProtocol,
					PortRange:    rule.EgressToPort,
					Destinations: dest,
				}
				f.OutboundRules = append(f.OutboundRules, OutboundRule)
			}
			r[i] = f
			i++
		}
	}

	m.cachedResources = r
	return m.cachedResources
}
func (m *Model) Resources() map[int]cloud.Resource {
	if len(m.cachedResources) > 0 {
		return m.cachedResources
	}
	r := make(map[int]cloud.Resource)
	i := 0

	// ---- [SSH Key] ----
	r[i] = &resources.SSH{
		Shared: resources.Shared{
			Name: m.known.Name,
		},
	}
	i++

	machineConfigs := m.known.MachineProviderConfigs()
	for _, machineConfig := range machineConfigs {
		serverPool := machineConfig.ServerPool
		// ---- [Droplet] ----
		r[i] = &resources.Droplet{
			Shared: resources.Shared{
				Name: serverPool.Name,
			},
			ServerPool: serverPool,
		}
		i++
	}

	for _, machineConfig := range machineConfigs {
		serverPool := machineConfig.ServerPool
		for _, firewall := range serverPool.Firewalls {
			// ---- [Firewall] ----
			f := &resources.Firewall{
				Shared: resources.Shared{
					Name:    serverPool.Name,
					CloudID: firewall.Identifier,
				},
				Tags:       []string{serverPool.Name},
				ServerPool: serverPool,
			}

			for _, rule := range firewall.IngressRules {
				var src *resources.Sources
				if _, _, err := net.ParseCIDR(rule.IngressSource); err == nil {
					src = &resources.Sources{
						Addresses: []string{rule.IngressSource},
					}
				} else if ip := net.ParseIP(rule.IngressSource); ip != nil {
					src = &resources.Sources{
						Addresses: []string{rule.IngressSource},
					}
				} else {
					src = &resources.Sources{
						Tags: []string{rule.IngressSource},
					}
				}

				InboundRule := resources.InboundRule{
					Protocol:  rule.IngressProtocol,
					PortRange: rule.IngressToPort,
					Source:    src,
				}
				f.InboundRules = append(f.InboundRules, InboundRule)
			}
			for _, rule := range firewall.EgressRules {
				var dest *resources.Destinations
				if _, _, err := net.ParseCIDR(rule.EgressDestination); err == nil {
					dest = &resources.Destinations{
						Addresses: []string{rule.EgressDestination},
					}
				} else if ip := net.ParseIP(rule.EgressDestination); ip != nil {
					dest = &resources.Destinations{
						Addresses: []string{rule.EgressDestination},
					}
				} else {
					dest = &resources.Destinations{
						Tags: []string{rule.EgressDestination},
					}
				}

				OutboundRule := resources.OutboundRule{
					Protocol:     rule.EgressProtocol,
					PortRange:    rule.EgressToPort,
					Destinations: dest,
				}
				f.OutboundRules = append(f.OutboundRules, OutboundRule)
			}
			r[i] = f
			i++
		}
	}

	m.cachedResources = r
	return m.cachedResources
}
// ClusterModel maps cluster info to DigitalOcean Resources.