package extnet import ( "context" "encoding/json" "net/http" "time" "repository.basistech.ru/BASIS/decort-golang-sdk/internal/constants" "repository.basistech.ru/BASIS/decort-golang-sdk/internal/validators" ) // CreateRequest struct for creating account type CreateRequest struct { // Name of the bridge network // Required: true BridgeNetworkName string `url:"bridge_network_name" json:"bridge_network_name" validate:"required"` // Detailed description of the external network // Required: true Description string `url:"description" json:"description" validate:"required"` // User-friendly name for the external network // Required: true DisplayName string `url:"display_name" json:"display_name" validate:"required"` // Whether the network is enabled // Required: true Enabled bool `url:"enabled" json:"enabled"` // List of hypervisor names // Required: true Hypervisors []string `url:"hypervisors" json:"hypervisors" validate:"required"` // List of external network ports // Required: false ExternalNetworkPorts []ExternalNetworkPortRequest `url:"-" json:"external_network_ports,omitempty"` // IPv4 default gateway address // Required: false DefaultGatewayIPv4 string `url:"default_gateway_ipv4,omitempty" json:"default_gateway_ipv4,omitempty"` // IPv6 default gateway address // Required: false DefaultGatewayIPv6 string `url:"default_gateway_ipv6,omitempty" json:"default_gateway_ipv6,omitempty"` // IPv4 subnet in CIDR notation (Either subnet_v4 or subnet_v6 must be specified) // Required: false SubnetV4 string `url:"subnet_v4,omitempty" json:"subnet_v4,omitempty"` // IPv6 subnet in CIDR notation (Either subnet_v4 or subnet_v6 must be specified) // Required: false SubnetV6 string `url:"subnet_v6,omitempty" json:"subnet_v6,omitempty"` // VLAN tag identifier // Required: false VLANTag string `url:"vlan_tag,omitempty" json:"vlan_tag,omitempty" validate:"omitempty,trunkTags"` } type ExternalNetworkPortRequest struct { // Access group ID // Required: true AccessGroupID string `url:"access_group_id" json:"access_group_id" validate:"required"` // Access group name // Required: false AccessGroupName string `url:"access_group_name,omitempty" json:"access_group_name,omitempty"` // Comment for the external network port // Required: true Comment string `url:"comment" json:"comment" validate:"required"` // User-friendly name for the external network port // Required: true DisplayName string `url:"display_name" json:"display_name" validate:"required"` // Whether the network pork is enabled // Required: true Enabled bool `url:"enabled" json:"enabled"` // IPv4 // Required: false IPv4 string `url:"ipv4,omitempty" json:"ipv4,omitempty"` // IPv6 // Required: false IPv6 string `url:"ipv6,omitempty" json:"ipv6,omitempty"` // IPv6 Config // Required: false IPv6Config *IPv6ConfigRequest `url:"-" json:"ipv6_config,omitempty"` // MAC address // Required: true MAC string `url:"mac" json:"mac" validate:"required"` // Router gateway port // Required: false RouterGatewayPort *RouterGatewayPortRequest `url:"-" json:"router_gateway_port,omitempty"` // Floating IP // Required: false FloatingIP *FloatingIPRequest `url:"-" json:"floating_ip,omitempty"` } type IPv6ConfigRequest struct { //Address Mode (Slaac or DhcpV6Stateful) // Required: true AddressMode string `url:"address_mode" json:"address_mode" validate:"required"` // If true, the port will periodically send RA packets. // Required: true EnablePeriodicRa bool `url:"enable_periodic_ra" json:"enable_periodic_ra"` // The number of waiting seconds between sending periodic RA // Required: true IntervalRa int64 `url:"interval_ra" json:"interval_ra" validate:"required"` // The Default Router Preference (PRF) indicates whether this router should be preferred over other default routers. // high, low, medium // Required: true RouterPreference string `url:"router_preference" json:"router_preference" validate:"required"` } type RouterGatewayPortRequest struct { // Created at // Required: true CreatedAt time.Time `url:"created_at" json:"created_at" validate:"required"` // Description // Required: true Description string `url:"description" json:"description" validate:"required"` // Port id // Required: true ID string `url:"id" json:"id" validate:"required"` // User-friendly name for the external network port // Required: true RouterDisplayName string `url:"router_display_name" json:"router_display_name" validate:"required"` // Router ID // Required: true RouterID string `url:"router_id" json:"router_id" validate:"required"` // SNAT Enabled // Required: true SNATEnabled bool `url:"snat_enabled" json:"snat_enabled"` // Updated at // Required: true UpdatedAt time.Time `url:"updated_at" json:"updated_at" validate:"required"` } type FloatingIPRequest struct { // Access group ID // Required: true AccessGroupID string `url:"access_group_id" json:"access_group_id" validate:"required"` // Access group name // Required: true AccessGroupName string `url:"access_group_name" json:"access_group_name" validate:"required"` // Created at // Required: true CreatedAt time.Time `url:"created_at" json:"created_at" validate:"required"` // External network port // Required: true ExternalNetworkPort string `url:"external_network_port" json:"external_network_port" validate:"required"` // ID of the Floating IP // Required: true ID string `url:"id" json:"id" validate:"required"` // Logical port // Required: false LogicalPort *LogicalPortRequest `url:"-" json:"logical_port,omitempty"` // Router // Required: true Router *RouterRequest `url:"-" json:"router" validate:"required"` // Updated at // Required: true UpdatedAt time.Time `url:"updated_at" json:"updated_at" validate:"required"` // ID of version // Required: true VersionID uint64 `url:"version_id" json:"version_id" validate:"required"` } type LogicalPortRequest struct { // Logical Port ID // Required: true ID string `url:"id" json:"id" validate:"required"` // Access group ID // Required: true AccessGroupID string `url:"access_group_id" json:"access_group_id" validate:"required"` // Access group name // Required: true AccessGroupName string `url:"access_group_name" json:"access_group_name" validate:"required"` // MAC of adapter // Required: true AdapterMAC string `url:"adapter_mac" json:"adapter_mac" validate:"required"` // Address detection // Required: true AddressDetection bool `url:"address_detection" json:"address_detection" validate:"required"` // Description // Required: true Description string `url:"description" json:"description" validate:"required"` // Created at // Required: false CreatedAt time.Time `url:"created_at,omitempty" json:"created_at,omitempty"` // User-friendly name for router // Required: true RouterDisplayName string `url:"router_display_name" json:"router_display_name" validate:"required"` // Whether the logical pork is enabled // Required: true Enabled bool `url:"enabled" json:"enabled"` // External Network ID // Required: false ExternalNetworkID string `url:"external_network_id,omitempty" json:"external_network_id,omitempty"` // Hypervisor // Required: true Hypervisor string `url:"hypervisor" json:"hypervisor" validate:"required"` // User-friendly name for hypervisor // Required: false HypervisorDisplayName string `url:"hypervisor_display_name,omitempty" json:"hypervisor_display_name,omitempty"` // Live Migration Target Hv // Required: true LiveMigrationTargetHV string `url:"live_migration_target_hv" json:"live_migration_target_hv" validate:"required"` // Status // Required: true Status *StatusRequest `url:"-" json:"status" validate:"required"` // Port bindings // Required: true Bindings *PortBindingsRequest `url:"-" json:"bindings" validate:"required"` // Unique Identifier // Required: true UniqueIDentifier string `url:"unique_identifier" json:"unique_identifier" validate:"required"` // Updated at // Required: true UpdatedAt time.Time `url:"updated_at" json:"updated_at" validate:"required"` // ID of version // Required: true VersionID uint64 `url:"version_id" json:"version_id" validate:"required"` } type StatusRequest struct { // Common // Required: true Common string `url:"common" json:"common" validate:"required"` // Hypervisors status // Required: false Hypervisors []HypervisorStatusRequest `url:"-" json:"hypervisors,omitempty"` } type PortBindingsRequest struct { // Binding ID // Required: true ID string `url:"id" json:"id" validate:"required"` // User-friendly name for segment // Required: true SegmentDisplayName string `url:"segment_display_name" json:"segment_display_name" validate:"required"` // Segment ID // Required: true SegmentID string `url:"segment_id" json:"segment_id" validate:"required"` // Port security // Required: true PortSecurity bool `url:"port_security" json:"port_security" validate:"required"` // Address detection // Required: true AddressDetection bool `url:"address_detection" json:"address_detection" validate:"required"` // Is Exclude From Firewall // Required: true IsExcludedFromFirewall bool `url:"is_excluded_from_firewall" json:"is_excluded_from_firewall" validate:"required"` // ID of version // Required: true VersionID uint64 `url:"version_id" json:"version_id" validate:"required"` // Created at // Required: true CreatedAt time.Time `url:"created_at" json:"created_at" validate:"required"` // Updated at // Required: true UpdatedAt time.Time `url:"updated_at" json:"updated_at" validate:"required"` // Logical port addresses // Required: true LogicalPortAddresses []LogicalPortAddressRequest `url:"-" json:"logical_port_addresses" validate:"required"` } type HypervisorStatusRequest struct { // Status // Required: true Status string `url:"status" json:"status" validate:"required"` // Name of hypervisor // Required: true Name string `url:"name" json:"name" validate:"required"` // User-friendly name for the hypervisor // Required: true DisplayName string `url:"display_name" json:"display_name" validate:"required"` // Hypervisor status // Required: true HypervisorStatus string `url:"hypervisor_status" json:"hypervisor_status" validate:"required"` // Synced at // Required: true SyncedAt time.Time `url:"synced_at" json:"synced_at" validate:"required"` } type LogicalPortAddressRequest struct { // IP of port // Required: true IP string `url:"ip" json:"ip" validate:"required"` // IP type (IPv4 or IPv6) // Required: true IPType string `url:"ip_type" json:"ip_type" validate:"required"` // Is discovered // Required: false IsDiscovered bool `url:"is_discovered,omitempty" json:"is_discovered,omitempty"` // Is discovered // Required: true IsPrimary bool `url:"is_primary" json:"is_primary" validate:"required"` // MAC // Required: false MAC string `url:"mac,omitempty" json:"mac,omitempty"` // ID // Required: true ID string `url:"id" json:"id" validate:"required"` // Logical port id // Required: true LogicalPortID string `url:"logical_port_id" json:"logical_port_id" validate:"required"` // Assigned at // Required: false AssignedAt time.Time `url:"assigned_at,omitempty" json:"assigned_at,omitempty"` } type RouterRequest struct { // Access group ID // Required: false AccessGroupID string `url:"access_group_id,omitempty" json:"access_group_id,omitempty"` // Access group name // Required: false AccessGroupName string `url:"access_group_name,omitempty" json:"access_group_name,omitempty"` // Created at // Required: false CreatedAt time.Time `url:"created_at,omitempty" json:"created_at,omitempty"` // Detailed description of the router // Required: false Description string `url:"description,omitempty" json:"description,omitempty"` // User-friendly name for the router // Required: true DisplayName string `url:"display_name" json:"display_name" validate:"required"` // Whether the router is enabled // Required: false Enabled bool `url:"enabled,omitempty" json:"enabled,omitempty"` // Gateway ports // Required: false GatewayPorts []GatewayPortRequest `url:"-" json:"gateway_ports,omitempty"` // ID // Required: true ID string `url:"id" json:"id" validate:"required"` // Policies // Required: false Policies []RouterPolicyRequest `url:"-" json:"policies,omitempty"` // Ports // Required: false Ports []RouterPortRequest `url:"-" json:"ports,omitempty"` // Status // Required: false Status *StatusRequest `url:"-" json:"status,omitempty"` // Updated at // Required: false UpdatedAt time.Time `url:"updated_at,omitempty" json:"updated_at,omitempty"` // ID of version // Required: false VersionID uint64 `url:"version_id,omitempty" json:"version_id,omitempty"` } type GatewayPortRequest struct { // Created at // Required: true CreatedAt time.Time `url:"created_at" json:"created_at" validate:"required"` // Description // Required: true Description string `url:"description" json:"description" validate:"required"` // L4 port max // Required: false ExternalL4PortMax int64 `url:"external_l4_port_max,omitempty" json:"external_l4_port_max,omitempty"` // L4 port min // Required: false ExternalL4PortMin int64 `url:"external_l4_port_min,omitempty" json:"external_l4_port_min,omitempty"` // External network port // Required: true ExternalNetworkPort interface{} `url:"external_network_port" json:"external_network_port" validate:"required"` // ID of port // Required: false ID string `url:"id,omitempty" json:"id,omitempty"` // SNAT Enabled // Required: true SNATEnabled bool `url:"snat_enabled" json:"snat_enabled"` // Status // Required: false Status *StatusRequest `url:"-" json:"status,omitempty"` // Updated at // Required: true UpdatedAt time.Time `url:"updated_at" json:"updated_at" validate:"required"` // ID of version // Required: true VersionID uint64 `url:"version_id" json:"version_id" validate:"required"` } type RouterPolicyRequest struct { // Action // Required: true Action string `url:"action" json:"action" validate:"required"` // Created at // Required: true CreatedAt time.Time `url:"created_at" json:"created_at" validate:"required"` // User-friendly name for the policy // Required: true DisplayName string `url:"display_name" json:"display_name" validate:"required"` // Whether the policy is enabled // Required: false Enabled bool `url:"enabled,omitempty" json:"enabled,omitempty"` // ID of port // Required: false ID string `url:"id,omitempty" json:"id,omitempty"` // Match // Required: true Match interface{} `url:"match" json:"match" validate:"required"` // Next IPv4 address // Required: true NextIPv4Address []string `url:"next_ipv4_address" json:"next_ipv4_address" validate:"required"` // Next IPv6 address // Required: true NextIPv6Address []string `url:"next_ipv6_address" json:"next_ipv6_address" validate:"required"` // Priority // Required: true Priority int64 `url:"priority" json:"priority" validate:"required"` // Updated at // Required: true UpdatedAt time.Time `url:"updated_at" json:"updated_at" validate:"required"` // ID of version // Required: true VersionID uint64 `url:"version_id" json:"version_id" validate:"required"` } type RouterPortRequest struct { // Created at // Required: true CreatedAt time.Time `url:"created_at" json:"created_at" validate:"required"` // Detailed description of the router port // Required: true Description string `url:"description" json:"description" validate:"required"` // Whether the router port is enabled // Required: true Enabled bool `url:"enabled" json:"enabled"` // ID of port // Required: false ID string `url:"id,omitempty" json:"id,omitempty"` // Next IPv4 address // Required: true NextIPv4Address []string `url:"next_ipv4_address" json:"next_ipv4_address" validate:"required"` // Next IPv6 address // Required: true NextIPv6Address []string `url:"next_ipv6_address" json:"next_ipv6_address" validate:"required"` // IPv6 Config // Required: true IPv6Config *IPv6ConfigRequest `url:"-" json:"ipv6_config" validate:"required"` // MAC address // Required: true MAC string `url:"mac" json:"mac" validate:"required"` // Segment // Required: true Segment *SegmentRequest `url:"-" json:"segment" validate:"required"` // Segment ID // Required: true SegmentID string `url:"segment_id" json:"segment_id" validate:"required"` // Status // Required: false Status *StatusRequest `url:"-" json:"status,omitempty"` // Updated at // Required: true UpdatedAt time.Time `url:"updated_at" json:"updated_at" validate:"required"` // ID of version // Required: true VersionID uint64 `url:"version_id" json:"version_id" validate:"required"` } type SegmentRequest struct { // Access group ID // Required: true AccessGroupID string `url:"access_group_id" json:"access_group_id" validate:"required"` // Access group name // Required: false AccessGroupName string `url:"access_group_name,omitempty" json:"access_group_name,omitempty"` // Created at // Required: true CreatedAt time.Time `url:"created_at" json:"created_at" validate:"required"` // Detailed description of the router port // Required: true Description string `url:"description" json:"description" validate:"required"` // DHCP IPv4 // Required: false DHCPv4 *DHCPv4ConfigRequest `url:"-" json:"dhcp_v4,omitempty"` // DHCP IPv6 // Required: false DHCPv6 *DHCPv6ConfigRequest `url:"-" json:"dhcp_v6,omitempty"` // User-friendly name for the segment // Required: true DisplayName string `url:"display_name" json:"display_name" validate:"required"` // Whether the segment is enabled // Required: false Enabled bool `url:"enabled,omitempty" json:"enabled,omitempty"` // ID of segment // Required: false ID string `url:"id,omitempty" json:"id,omitempty"` // Logical ports info // Required: false LogicalPortsInfo []EntityInfoRequest `url:"-" json:"logical_ports_info,omitempty"` // Routers info // Required: false RoutersInfo []EntityInfoRequest `url:"-" json:"routers_info,omitempty"` // Status // Required: false Status *StatusRequest `url:"-" json:"status,omitempty"` // IPv4 subnet in CIDR notation (Either subnet_v4 or subnet_v6 must be specified) // Required: false SubnetV4 string `url:"subnet_v4,omitempty" json:"subnet_v4,omitempty"` // IPv6 subnet in CIDR notation (Either subnet_v4 or subnet_v6 must be specified) // Required: false SubnetV6 string `url:"subnet_v6,omitempty" json:"subnet_v6,omitempty"` // Updated at // Required: true UpdatedAt time.Time `url:"updated_at" json:"updated_at" validate:"required"` // ID of version // Required: true VersionID uint64 `url:"version_id" json:"version_id" validate:"required"` } type DHCPv4ConfigRequest struct { // DNS // Required: false DNS []string `url:"dns,omitempty" json:"dns,omitempty"` // Excluded address ranges // Required: false ExcludedAddressRanges []string `url:"excluded_address_ranges,omitempty" json:"excluded_address_ranges,omitempty"` // Gateway // Required: true Gateway string `url:"gateway" json:"gateway" validate:"required"` // ID of config // Required: false ID string `url:"id,omitempty" json:"id,omitempty"` // Lease time // Required: false LeaseTime int64 `url:"lease_time,omitempty" json:"lease_time,omitempty"` // Server IP // Required: true ServerIP string `url:"server_ip" json:"server_ip" validate:"required"` // Server MAC // Required: false ServerMAC string `url:"server_mac,omitempty" json:"server_mac,omitempty"` // Whether the config is enabled // Required: true Enabled bool `url:"enabled" json:"enabled"` } type DHCPv6ConfigRequest struct { // Address prefix // Required: true AddressPrefix string `url:"address_prefix" json:"address_prefix" validate:"required"` // DNS // Required: false DNS []string `url:"dns,omitempty" json:"dns,omitempty"` // ID of config // Required: false ID string `url:"id,omitempty" json:"id,omitempty"` // Lease time // Required: true LeaseTime int64 `url:"lease_time" json:"lease_time" validate:"required"` // Server MAC // Required: true ServerMAC string `url:"server_mac" json:"server_mac" validate:"required"` // Whether the config is enabled // Required: true Enabled bool `url:"enabled" json:"enabled"` } type EntityInfoRequest struct { // User-friendly name for the entity // Required: true DisplayName string `url:"display_name" json:"display_name" validate:"required"` // ID of entity // Required: false ID string `url:"id,omitempty" json:"id,omitempty"` } // Create creates extnet func (e ExtNet) Create(ctx context.Context, req CreateRequest) (*ExternalNetworkResponse, error) { err := validators.ValidateRequest(req) if err != nil { return nil, validators.ValidationErrors(validators.GetErrors(err)) } url := "/sdn/external_network/create" res, err := e.client.DecortApiCallCtype(ctx, http.MethodPost, url, constants.MIMEJSON, req) if err != nil { return nil, err } info := ExternalNetworkResponse{} err = json.Unmarshal(res, &info) if err != nil { return nil, err } return &info, nil }