From ce07d2218a8f09e1cab28f7f779f7f0b62f35e48 Mon Sep 17 00:00:00 2001 From: Mircea-Pavel ANTON Date: Tue, 28 May 2024 18:38:44 +0000 Subject: [PATCH 01/10] add bandwitdh server resource --- routeros/resource_tool_bandwidth_server.go | 57 ++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 routeros/resource_tool_bandwidth_server.go diff --git a/routeros/resource_tool_bandwidth_server.go b/routeros/resource_tool_bandwidth_server.go new file mode 100644 index 00000000..fdf4ed60 --- /dev/null +++ b/routeros/resource_tool_bandwidth_server.go @@ -0,0 +1,57 @@ +tpackage routeros + +import ( + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" +) + +/* +{ + "allowed-interface-list": "LAN" +} +*/ + +// https://help.mikrotik.com/docs/display/ROS/Bandwidth+Test +func ResourceToolMacServer() *schema.Resource { + resSchema := map[string]*schema.Schema{ + MetaResourcePath: PropResourcePath("/tool/bandwidth-server"), + MetaId: PropId(Id), + + "enabled": { + Type: schema.TypeBool, + Optional: true, + Default: true, + Description: "Defines whether bandwidth server is enabled or not.", + }, + "authenticate": { + Type: schema.TypeBool, + Optional: true, + Default: true, + Description: "Communicate only with authenticated clients.", + }, + "max_sessions ": { + Type: schema.TypeInt, + Optional: true, + Default: 100, + Description: "Maximal simultaneous test count.", + }, + "allocate_udp_ports_from ": { + Type: schema.TypeBool, + Optional: true, + Default: 2000, + Description: "Beginning of UDP port range.", + }, + } + + return &schema.Resource{ + CreateContext: DefaultSystemCreate(resSchema), + ReadContext: DefaultSystemRead(resSchema), + UpdateContext: DefaultSystemUpdate(resSchema), + DeleteContext: DefaultSystemDelete(resSchema), + + Importer: &schema.ResourceImporter{ + StateContext: schema.ImportStatePassthroughContext, + }, + + Schema: resSchema, + } +} From 4f0f09e6b3111a72d0ef90fddd250374d4ab415f Mon Sep 17 00:00:00 2001 From: Mircea-Pavel ANTON Date: Tue, 28 May 2024 18:39:03 +0000 Subject: [PATCH 02/10] add tests for the bandwitdh server resource --- .../resource_tool_bandwidth_server_test.go | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 routeros/resource_tool_bandwidth_server_test.go diff --git a/routeros/resource_tool_bandwidth_server_test.go b/routeros/resource_tool_bandwidth_server_test.go new file mode 100644 index 00000000..c4c169fe --- /dev/null +++ b/routeros/resource_tool_bandwidth_server_test.go @@ -0,0 +1,59 @@ +package routeros + +import ( + "testing" + + "github.com/hashicorp/terraform-plugin-testing/helper/resource" +) + +const testToolsBandwidthServer = "routeros_tool_bandwidth_server.test" + +func TestAccToolsBandwidthServerTest_basic(t *testing.T) { + for _, name := range testNames { + t.Run(name, func(t *testing.T) { + resource.Test(t, resource.TestCase{ + PreCheck: func() { + testAccPreCheck(t) + testSetTransportEnv(t, name) + }, + ProviderFactories: testAccProviderFactories, + Steps: []resource.TestStep{ + { + Config: testAccToolsBandwidthServerConfig_none("none"), + Check: resource.ComposeTestCheckFunc( + testResourcePrimaryInstanceId(testToolsBandwidthServer), + resource.TestCheckResourceAttr(testToolsBandwidthServer), + ), + }, + { + Config: testAccToolsBandwidthServerConfig_complex("all"), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr(testToolsBandwidthServer), + ), + }, + }, + }) + }) + } +} + +func testAccToolsBandwidthServerConfig_none(acl string) string { + return providerConfig + ` + +resource "routeros_tool_bandwidth_test_server" "test" { + enabled = false +} +` +} + +func testAccToolsBandwidthServerConfig_complex(acl string) string { + return providerConfig + ` + +resource "routeros_tool_bandwidth_test_server" "test" { + enabled = true + authenticate = false + max_sessions = 100 + allocate_udp_ports_from = 2000 +} +` +} From 476226132c35d7e998acdf5e266cd434dec1ef9a Mon Sep 17 00:00:00 2001 From: Mircea-Pavel ANTON Date: Tue, 28 May 2024 18:39:17 +0000 Subject: [PATCH 03/10] specify the bandwitdh server resource in provider --- routeros/provider.go | 605 ++++++++++++++++++++++--------------------- 1 file changed, 303 insertions(+), 302 deletions(-) diff --git a/routeros/provider.go b/routeros/provider.go index 8d41a672..fb304860 100644 --- a/routeros/provider.go +++ b/routeros/provider.go @@ -1,302 +1,303 @@ -package routeros - -import ( - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" -) - -var ( - ErrorMsgPut = "An error was encountered while sending a PUT request to the API: %v" - ErrorMsgGet = "An error was encountered while sending a GET request to the API: %v" - ErrorMsgPatch = "An error was encountered while sending a PATCH request to the API: %v" - ErrorMsgDelete = "An error was encountered while sending a DELETE request to the API: %v" -) - -func Provider() *schema.Provider { - return &schema.Provider{ - Schema: map[string]*schema.Schema{ - "hosturl": { - Type: schema.TypeString, - Required: true, - DefaultFunc: schema.MultiEnvDefaultFunc( - []string{"ROS_HOSTURL", "MIKROTIK_HOST"}, - nil, - ), - Description: `URL of the MikroTik router, default is TLS connection to REST. - * API: api[s]://host[:port] - * api://router.local - * apis://router.local:8729 - * REST: http[s]://host - * http://router.local - * https://router.local - * router.local - * 127.0.0.1 - - - export ROS_HOSTURL=router.local or export MIKROTIK_HOST=router.local -`, - }, - "username": { - Type: schema.TypeString, - Required: true, - DefaultFunc: schema.MultiEnvDefaultFunc( - []string{"ROS_USERNAME", "MIKROTIK_USER"}, - nil, - ), - Description: `Username for the MikroTik WEB/Winbox. - - - export ROS_USERNAME=admin or export MIKROTIK_USER=admin -`, - }, - "password": { - Type: schema.TypeString, - Optional: true, - DefaultFunc: schema.MultiEnvDefaultFunc( - []string{"ROS_PASSWORD", "MIKROTIK_PASSWORD"}, - nil, - ), - Description: "Password for the MikroTik user.", - Sensitive: true, - }, - "ca_certificate": { - Type: schema.TypeString, - Optional: true, - DefaultFunc: schema.MultiEnvDefaultFunc( - []string{"ROS_CA_CERTIFICATE", "MIKROTIK_CA_CERTIFICATE"}, - nil, - ), - Description: "Path to MikroTik's certificate authority file.", - }, - "insecure": { - Type: schema.TypeBool, - Optional: true, - DefaultFunc: schema.MultiEnvDefaultFunc( - []string{"ROS_INSECURE", "MIKROTIK_INSECURE"}, - false, - ), - Description: "Whether to verify the SSL certificate or not.", - }, - }, - ResourcesMap: map[string]*schema.Resource{ - - // IP objects - "routeros_ip_dhcp_client": ResourceDhcpClient(), - "routeros_ip_dhcp_client_option": ResourceDhcpClientOption(), - "routeros_ip_dhcp_relay": ResourceDhcpRelay(), - "routeros_ip_dhcp_server": ResourceDhcpServer(), - "routeros_ip_dhcp_server_config": ResourceDhcpServerConfig(), - "routeros_ip_dhcp_server_network": ResourceDhcpServerNetwork(), - "routeros_ip_dhcp_server_lease": ResourceDhcpServerLease(), - "routeros_ip_dhcp_server_option": ResourceDhcpServerOption(), - "routeros_ip_dhcp_server_option_set": ResourceDhcpServerOptionSet(), - "routeros_ip_firewall_addr_list": ResourceIPFirewallAddrList(), - "routeros_ip_firewall_connection_tracking": ResourceIPConnectionTracking(), - "routeros_ip_firewall_filter": ResourceIPFirewallFilter(), - "routeros_ip_firewall_mangle": ResourceIPFirewallMangle(), - "routeros_ip_firewall_nat": ResourceIPFirewallNat(), - "routeros_ip_firewall_raw": ResourceIPFirewallRaw(), - "routeros_ip_address": ResourceIPAddress(), - "routeros_ip_pool": ResourceIPPool(), - "routeros_ip_route": ResourceIPRoute(), - "routeros_ip_dns": ResourceDns(), - "routeros_ip_dns_record": ResourceDnsRecord(), - "routeros_ip_service": ResourceIpService(), - "routeros_ip_neighbor_discovery_settings": ResourceIpNeighborDiscoverySettings(), - "routeros_ip_ssh_server": ResourceIpSSHServer(), - "routeros_ip_upnp": ResourceUPNPSettings(), - "routeros_ip_upnp_interfaces": ResourceUPNPInterfaces(), - "routeros_ip_vrf": ResourceIPVrf(), - "routeros_ipv6_address": ResourceIPv6Address(), - "routeros_ipv6_dhcp_client": ResourceIPv6DhcpClient(), - "routeros_ipv6_dhcp_client_option": ResourceIPv6DhcpClientOption(), - "routeros_ipv6_firewall_addr_list": ResourceIPv6FirewallAddrList(), - "routeros_ipv6_firewall_filter": ResourceIPv6FirewallFilter(), - "routeros_ipv6_neighbor_discovery": ResourceIPv6NeighborDiscovery(), - "routeros_ipv6_route": ResourceIPv6Route(), - - // Aliases for IP objects to retain compatibility between original and fork - "routeros_dhcp_client": ResourceDhcpClient(), - "routeros_dhcp_client_option": ResourceDhcpClientOption(), - "routeros_dhcp_server": ResourceDhcpServer(), - "routeros_dhcp_server_network": ResourceDhcpServerNetwork(), - "routeros_dhcp_server_lease": ResourceDhcpServerLease(), - "routeros_firewall_addr_list": ResourceIPFirewallAddrList(), - "routeros_firewall_filter": ResourceIPFirewallFilter(), - "routeros_firewall_mangle": ResourceIPFirewallMangle(), - "routeros_firewall_nat": ResourceIPFirewallNat(), - "routeros_dns": ResourceDns(), - "routeros_dns_record": ResourceDnsRecord(), - - // Interface Objects - "routeros_interface_bridge": ResourceInterfaceBridge(), - "routeros_interface_bridge_port": ResourceInterfaceBridgePort(), - "routeros_interface_bridge_vlan": ResourceInterfaceBridgeVlan(), - "routeros_interface_bridge_settings": ResourceInterfaceBridgeSettings(), - "routeros_interface_dot1x_client": ResourceInterfaceDot1xClient(), - "routeros_interface_dot1x_server": ResourceInterfaceDot1xServer(), - "routeros_interface_eoip": ResourceInterfaceEoip(), - "routeros_interface_ethernet_switch": ResourceInterfaceEthernetSwitch(), - "routeros_interface_ethernet_switch_host": ResourceInterfaceEthernetSwitchHost(), - "routeros_interface_ethernet_switch_port": ResourceInterfaceEthernetSwitchPort(), - "routeros_interface_ethernet_switch_port_isolation": ResourceInterfaceEthernetSwitchPortIsolation(), - "routeros_interface_ethernet_switch_vlan": ResourceInterfaceEthernetSwitchVlan(), - "routeros_interface_ethernet_switch_rule": ResourceInterfaceEthernetSwitchRule(), - "routeros_interface_gre": ResourceInterfaceGre(), - "routeros_interface_macvlan": ResourceInterfaceMacVlan(), - "routeros_interface_ipip": ResourceInterfaceIPIP(), - "routeros_interface_vlan": ResourceInterfaceVlan(), - "routeros_interface_vrrp": ResourceInterfaceVrrp(), - "routeros_interface_wireguard": ResourceInterfaceWireguard(), - "routeros_interface_wireguard_peer": ResourceInterfaceWireguardPeer(), - "routeros_interface_wireless_cap": ResourceInterfaceWirelessCap(), - "routeros_interface_list": ResourceInterfaceList(), - "routeros_interface_list_member": ResourceInterfaceListMember(), - "routeros_interface_ovpn_server": ResourceInterfaceOpenVPNServer(), - "routeros_interface_ovpn_client": ResourceOpenVPNClient(), - "routeros_interface_veth": ResourceInterfaceVeth(), - "routeros_interface_bonding": ResourceInterfaceBonding(), - "routeros_interface_pppoe_client": ResourceInterfacePPPoEClient(), - "routeros_interface_ethernet": ResourceInterfaceEthernet(), - - // Aliases for interface objects to retain compatibility between original and fork - "routeros_bridge": ResourceInterfaceBridge(), - "routeros_bridge_mlag": ResourceInterfaceBridgeMlag(), - "routeros_bridge_port": ResourceInterfaceBridgePort(), - "routeros_bridge_vlan": ResourceInterfaceBridgeVlan(), - "routeros_gre": ResourceInterfaceGre(), - "routeros_ipip": ResourceInterfaceIPIP(), - "routeros_vlan": ResourceInterfaceVlan(), - "routeros_vrrp": ResourceInterfaceVrrp(), - "routeros_wireguard": ResourceInterfaceWireguard(), - "routeros_wireguard_peer": ResourceInterfaceWireguardPeer(), - - // System Objects - "routeros_ip_cloud": ResourceIpCloud(), - "routeros_ip_cloud_advanced": ResourceIpCloudAdvanced(), - "routeros_system_certificate": ResourceSystemCertificate(), - "routeros_certificate_scep_server": ResourceCertificateScepServer(), - "routeros_system_clock": ResourceSystemClock(), - "routeros_system_identity": ResourceSystemIdentity(), - "routeros_system_logging": ResourceSystemLogging(), - "routeros_system_ntp_client": ResourceSystemNtpClient(), - "routeros_system_ntp_server": ResourceSystemNtpServer(), - "routeros_system_scheduler": ResourceSystemScheduler(), - "routeros_system_script": ResourceSystemScript(), - "routeros_system_user": ResourceUser(), - "routeros_system_user_aaa": ResourceUserAaa(), - "routeros_system_user_group": ResourceUserGroup(), - "routeros_system_user_settings": ResourceSystemUserSettings(), - - // Aliases for system objects to retain compatibility between original and fork - "routeros_identity": ResourceSystemIdentity(), - "routeros_scheduler": ResourceSystemScheduler(), - - // CAPsMAN Objects - "routeros_capsman_aaa": ResourceCapsManAaa(), - "routeros_capsman_access_list": ResourceCapsManAccessList(), - "routeros_capsman_channel": ResourceCapsManChannel(), - "routeros_capsman_configuration": ResourceCapsManConfiguration(), - "routeros_capsman_datapath": ResourceCapsManDatapath(), - "routeros_capsman_interface": ResourceCapsManInterface(), - "routeros_capsman_manager": ResourceCapsManManager(), - "routeros_capsman_manager_interface": ResourceCapsManManagerInterface(), - "routeros_capsman_provisioning": ResourceCapsManProvisioning(), - "routeros_capsman_rates": ResourceCapsManRates(), - "routeros_capsman_security": ResourceCapsManSecurity(), - - // Container objects - "routeros_container": ResourceContainer(), - "routeros_container_config": ResourceContainerConfig(), - "routeros_container_envs": ResourceContainerEnvs(), - "routeros_container_mounts": ResourceContainerMounts(), - - // File objects - "routeros_file": ResourceFile(), - - // Routing - "routeros_routing_bgp_connection": ResourceRoutingBGPConnection(), - "routeros_routing_bgp_template": ResourceRoutingBGPTemplate(), - "routeros_routing_filter_rule": ResourceRoutingFilterRule(), - "routeros_routing_table": ResourceRoutingTable(), - - // OSPF - "routeros_routing_ospf_instance": ResourceRoutingOspfInstance(), - "routeros_routing_ospf_area": ResourceRoutingOspfArea(), - "routeros_routing_ospf_interface_template": ResourceRoutingOspfInterfaceTemplate(), - - // VPN - "routeros_ovpn_server": ResourceOpenVPNServer(), - - // PPP - "routeros_ppp_aaa": ResourcePppAaa(), - "routeros_ppp_profile": ResourcePPPProfile(), - "routeros_ppp_secret": ResourcePPPSecret(), - - // RADIUS - "routeros_radius": ResourceRadius(), - "routeros_radius_incoming": ResourceRadiusIncoming(), - - // SNMP - "routeros_snmp": ResourceSNMP(), - "routeros_snmp_community": ResourceSNMPCommunity(), - - // Helpers - "routeros_wireguard_keys": ResourceWireguardKeys(), - "routeros_move_items": ResourceMoveItems(), - - // Tools - "routeros_tool_mac_server": ResourceToolMacServer(), - "routeros_tool_mac_server_winbox": ResourceToolMacServerWinBox(), - - // User Manager - "routeros_user_manager_advanced": ResourceUserManagerAdvanced(), - "routeros_user_manager_attribute": ResourceUserManagerAttribute(), - "routeros_user_manager_database": ResourceUserManagerDatabase(), - "routeros_user_manager_limitation": ResourceUserManagerLimitation(), - "routeros_user_manager_profile": ResourceUserManagerProfile(), - "routeros_user_manager_profile_limitation": ResourceUserManagerProfileLimitation(), - "routeros_user_manager_router": ResourceUserManagerRouter(), - "routeros_user_manager_settings": ResourceUserManagerSettings(), - "routeros_user_manager_user": ResourceUserManagerUser(), - "routeros_user_manager_user_group": ResourceUserManagerUserGroup(), - "routeros_user_manager_user_profile": ResourceUserManagerUserProfile(), - - // WiFi - "routeros_wifi": ResourceWifi(), - "routeros_wifi_aaa": ResourceWifiAaa(), - "routeros_wifi_access_list": ResourceWifiAccessList(), - "routeros_wifi_cap": ResourceWifiCap(), - "routeros_wifi_capsman": ResourceWifiCapsman(), - "routeros_wifi_channel": ResourceWifiChannel(), - "routeros_wifi_configuration": ResourceWifiConfiguration(), - "routeros_wifi_datapath": ResourceWifiDatapath(), - "routeros_wifi_interworking": ResourceWifiInterworking(), - "routeros_wifi_provisioning": ResourceWifiProvisioning(), - "routeros_wifi_security": ResourceWifiSecurity(), - "routeros_wifi_steering": ResourceWifiSteering(), - - // ZeroTier - "routeros_zerotier": ResourceZerotier(), - "routeros_zerotier_controller": ResourceZerotierController(), - "routeros_zerotier_interface": ResourceZerotierInterface(), - }, - DataSourcesMap: map[string]*schema.Resource{ - "routeros_files": DatasourceFiles(), - "routeros_firewall": DatasourceFirewall(), - "routeros_interfaces": DatasourceInterfaces(), - "routeros_ip_addresses": DatasourceIPAddresses(), - "routeros_ip_arp": DatasourceIpArp(), - "routeros_ip_dhcp_server_leases": DatasourceIpDhcpServerLeases(), - "routeros_ip_routes": DatasourceIPRoutes(), - "routeros_ip_services": DatasourceIPServices(), - "routeros_ipv6_addresses": DatasourceIPv6Addresses(), - "routeros_system_resource": DatasourceSystemResource(), - "routeros_x509": DatasourceX509(), - }, - ConfigureContextFunc: NewClient, - } -} - -func NewProvider() *schema.Provider { - return Provider() -} +package routeros + +import ( + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" +) + +var ( + ErrorMsgPut = "An error was encountered while sending a PUT request to the API: %v" + ErrorMsgGet = "An error was encountered while sending a GET request to the API: %v" + ErrorMsgPatch = "An error was encountered while sending a PATCH request to the API: %v" + ErrorMsgDelete = "An error was encountered while sending a DELETE request to the API: %v" +) + +func Provider() *schema.Provider { + return &schema.Provider{ + Schema: map[string]*schema.Schema{ + "hosturl": { + Type: schema.TypeString, + Required: true, + DefaultFunc: schema.MultiEnvDefaultFunc( + []string{"ROS_HOSTURL", "MIKROTIK_HOST"}, + nil, + ), + Description: `URL of the MikroTik router, default is TLS connection to REST. + * API: api[s]://host[:port] + * api://router.local + * apis://router.local:8729 + * REST: http[s]://host + * http://router.local + * https://router.local + * router.local + * 127.0.0.1 + + + export ROS_HOSTURL=router.local or export MIKROTIK_HOST=router.local +`, + }, + "username": { + Type: schema.TypeString, + Required: true, + DefaultFunc: schema.MultiEnvDefaultFunc( + []string{"ROS_USERNAME", "MIKROTIK_USER"}, + nil, + ), + Description: `Username for the MikroTik WEB/Winbox. + + + export ROS_USERNAME=admin or export MIKROTIK_USER=admin +`, + }, + "password": { + Type: schema.TypeString, + Optional: true, + DefaultFunc: schema.MultiEnvDefaultFunc( + []string{"ROS_PASSWORD", "MIKROTIK_PASSWORD"}, + nil, + ), + Description: "Password for the MikroTik user.", + Sensitive: true, + }, + "ca_certificate": { + Type: schema.TypeString, + Optional: true, + DefaultFunc: schema.MultiEnvDefaultFunc( + []string{"ROS_CA_CERTIFICATE", "MIKROTIK_CA_CERTIFICATE"}, + nil, + ), + Description: "Path to MikroTik's certificate authority file.", + }, + "insecure": { + Type: schema.TypeBool, + Optional: true, + DefaultFunc: schema.MultiEnvDefaultFunc( + []string{"ROS_INSECURE", "MIKROTIK_INSECURE"}, + false, + ), + Description: "Whether to verify the SSL certificate or not.", + }, + }, + ResourcesMap: map[string]*schema.Resource{ + + // IP objects + "routeros_ip_dhcp_client": ResourceDhcpClient(), + "routeros_ip_dhcp_client_option": ResourceDhcpClientOption(), + "routeros_ip_dhcp_relay": ResourceDhcpRelay(), + "routeros_ip_dhcp_server": ResourceDhcpServer(), + "routeros_ip_dhcp_server_config": ResourceDhcpServerConfig(), + "routeros_ip_dhcp_server_network": ResourceDhcpServerNetwork(), + "routeros_ip_dhcp_server_lease": ResourceDhcpServerLease(), + "routeros_ip_dhcp_server_option": ResourceDhcpServerOption(), + "routeros_ip_dhcp_server_option_set": ResourceDhcpServerOptionSet(), + "routeros_ip_firewall_addr_list": ResourceIPFirewallAddrList(), + "routeros_ip_firewall_connection_tracking": ResourceIPConnectionTracking(), + "routeros_ip_firewall_filter": ResourceIPFirewallFilter(), + "routeros_ip_firewall_mangle": ResourceIPFirewallMangle(), + "routeros_ip_firewall_nat": ResourceIPFirewallNat(), + "routeros_ip_firewall_raw": ResourceIPFirewallRaw(), + "routeros_ip_address": ResourceIPAddress(), + "routeros_ip_pool": ResourceIPPool(), + "routeros_ip_route": ResourceIPRoute(), + "routeros_ip_dns": ResourceDns(), + "routeros_ip_dns_record": ResourceDnsRecord(), + "routeros_ip_service": ResourceIpService(), + "routeros_ip_neighbor_discovery_settings": ResourceIpNeighborDiscoverySettings(), + "routeros_ip_ssh_server": ResourceIpSSHServer(), + "routeros_ip_upnp": ResourceUPNPSettings(), + "routeros_ip_upnp_interfaces": ResourceUPNPInterfaces(), + "routeros_ip_vrf": ResourceIPVrf(), + "routeros_ipv6_address": ResourceIPv6Address(), + "routeros_ipv6_dhcp_client": ResourceIPv6DhcpClient(), + "routeros_ipv6_dhcp_client_option": ResourceIPv6DhcpClientOption(), + "routeros_ipv6_firewall_addr_list": ResourceIPv6FirewallAddrList(), + "routeros_ipv6_firewall_filter": ResourceIPv6FirewallFilter(), + "routeros_ipv6_neighbor_discovery": ResourceIPv6NeighborDiscovery(), + "routeros_ipv6_route": ResourceIPv6Route(), + + // Aliases for IP objects to retain compatibility between original and fork + "routeros_dhcp_client": ResourceDhcpClient(), + "routeros_dhcp_client_option": ResourceDhcpClientOption(), + "routeros_dhcp_server": ResourceDhcpServer(), + "routeros_dhcp_server_network": ResourceDhcpServerNetwork(), + "routeros_dhcp_server_lease": ResourceDhcpServerLease(), + "routeros_firewall_addr_list": ResourceIPFirewallAddrList(), + "routeros_firewall_filter": ResourceIPFirewallFilter(), + "routeros_firewall_mangle": ResourceIPFirewallMangle(), + "routeros_firewall_nat": ResourceIPFirewallNat(), + "routeros_dns": ResourceDns(), + "routeros_dns_record": ResourceDnsRecord(), + + // Interface Objects + "routeros_interface_bridge": ResourceInterfaceBridge(), + "routeros_interface_bridge_port": ResourceInterfaceBridgePort(), + "routeros_interface_bridge_vlan": ResourceInterfaceBridgeVlan(), + "routeros_interface_bridge_settings": ResourceInterfaceBridgeSettings(), + "routeros_interface_dot1x_client": ResourceInterfaceDot1xClient(), + "routeros_interface_dot1x_server": ResourceInterfaceDot1xServer(), + "routeros_interface_eoip": ResourceInterfaceEoip(), + "routeros_interface_ethernet_switch": ResourceInterfaceEthernetSwitch(), + "routeros_interface_ethernet_switch_host": ResourceInterfaceEthernetSwitchHost(), + "routeros_interface_ethernet_switch_port": ResourceInterfaceEthernetSwitchPort(), + "routeros_interface_ethernet_switch_port_isolation": ResourceInterfaceEthernetSwitchPortIsolation(), + "routeros_interface_ethernet_switch_vlan": ResourceInterfaceEthernetSwitchVlan(), + "routeros_interface_ethernet_switch_rule": ResourceInterfaceEthernetSwitchRule(), + "routeros_interface_gre": ResourceInterfaceGre(), + "routeros_interface_macvlan": ResourceInterfaceMacVlan(), + "routeros_interface_ipip": ResourceInterfaceIPIP(), + "routeros_interface_vlan": ResourceInterfaceVlan(), + "routeros_interface_vrrp": ResourceInterfaceVrrp(), + "routeros_interface_wireguard": ResourceInterfaceWireguard(), + "routeros_interface_wireguard_peer": ResourceInterfaceWireguardPeer(), + "routeros_interface_wireless_cap": ResourceInterfaceWirelessCap(), + "routeros_interface_list": ResourceInterfaceList(), + "routeros_interface_list_member": ResourceInterfaceListMember(), + "routeros_interface_ovpn_server": ResourceInterfaceOpenVPNServer(), + "routeros_interface_ovpn_client": ResourceOpenVPNClient(), + "routeros_interface_veth": ResourceInterfaceVeth(), + "routeros_interface_bonding": ResourceInterfaceBonding(), + "routeros_interface_pppoe_client": ResourceInterfacePPPoEClient(), + "routeros_interface_ethernet": ResourceInterfaceEthernet(), + + // Aliases for interface objects to retain compatibility between original and fork + "routeros_bridge": ResourceInterfaceBridge(), + "routeros_bridge_mlag": ResourceInterfaceBridgeMlag(), + "routeros_bridge_port": ResourceInterfaceBridgePort(), + "routeros_bridge_vlan": ResourceInterfaceBridgeVlan(), + "routeros_gre": ResourceInterfaceGre(), + "routeros_ipip": ResourceInterfaceIPIP(), + "routeros_vlan": ResourceInterfaceVlan(), + "routeros_vrrp": ResourceInterfaceVrrp(), + "routeros_wireguard": ResourceInterfaceWireguard(), + "routeros_wireguard_peer": ResourceInterfaceWireguardPeer(), + + // System Objects + "routeros_ip_cloud": ResourceIpCloud(), + "routeros_ip_cloud_advanced": ResourceIpCloudAdvanced(), + "routeros_system_certificate": ResourceSystemCertificate(), + "routeros_certificate_scep_server": ResourceCertificateScepServer(), + "routeros_system_clock": ResourceSystemClock(), + "routeros_system_identity": ResourceSystemIdentity(), + "routeros_system_logging": ResourceSystemLogging(), + "routeros_system_ntp_client": ResourceSystemNtpClient(), + "routeros_system_ntp_server": ResourceSystemNtpServer(), + "routeros_system_scheduler": ResourceSystemScheduler(), + "routeros_system_script": ResourceSystemScript(), + "routeros_system_user": ResourceUser(), + "routeros_system_user_aaa": ResourceUserAaa(), + "routeros_system_user_group": ResourceUserGroup(), + "routeros_system_user_settings": ResourceSystemUserSettings(), + + // Aliases for system objects to retain compatibility between original and fork + "routeros_identity": ResourceSystemIdentity(), + "routeros_scheduler": ResourceSystemScheduler(), + + // CAPsMAN Objects + "routeros_capsman_aaa": ResourceCapsManAaa(), + "routeros_capsman_access_list": ResourceCapsManAccessList(), + "routeros_capsman_channel": ResourceCapsManChannel(), + "routeros_capsman_configuration": ResourceCapsManConfiguration(), + "routeros_capsman_datapath": ResourceCapsManDatapath(), + "routeros_capsman_interface": ResourceCapsManInterface(), + "routeros_capsman_manager": ResourceCapsManManager(), + "routeros_capsman_manager_interface": ResourceCapsManManagerInterface(), + "routeros_capsman_provisioning": ResourceCapsManProvisioning(), + "routeros_capsman_rates": ResourceCapsManRates(), + "routeros_capsman_security": ResourceCapsManSecurity(), + + // Container objects + "routeros_container": ResourceContainer(), + "routeros_container_config": ResourceContainerConfig(), + "routeros_container_envs": ResourceContainerEnvs(), + "routeros_container_mounts": ResourceContainerMounts(), + + // File objects + "routeros_file": ResourceFile(), + + // Routing + "routeros_routing_bgp_connection": ResourceRoutingBGPConnection(), + "routeros_routing_bgp_template": ResourceRoutingBGPTemplate(), + "routeros_routing_filter_rule": ResourceRoutingFilterRule(), + "routeros_routing_table": ResourceRoutingTable(), + + // OSPF + "routeros_routing_ospf_instance": ResourceRoutingOspfInstance(), + "routeros_routing_ospf_area": ResourceRoutingOspfArea(), + "routeros_routing_ospf_interface_template": ResourceRoutingOspfInterfaceTemplate(), + + // VPN + "routeros_ovpn_server": ResourceOpenVPNServer(), + + // PPP + "routeros_ppp_aaa": ResourcePppAaa(), + "routeros_ppp_profile": ResourcePPPProfile(), + "routeros_ppp_secret": ResourcePPPSecret(), + + // RADIUS + "routeros_radius": ResourceRadius(), + "routeros_radius_incoming": ResourceRadiusIncoming(), + + // SNMP + "routeros_snmp": ResourceSNMP(), + "routeros_snmp_community": ResourceSNMPCommunity(), + + // Helpers + "routeros_wireguard_keys": ResourceWireguardKeys(), + "routeros_move_items": ResourceMoveItems(), + + // Tools + "routeros_tool_bandwidth_server": ResourceToolBandwidthServer(), + "routeros_tool_mac_server": ResourceToolMacServer(), + "routeros_tool_mac_server_winbox": ResourceToolMacServerWinBox(), + + // User Manager + "routeros_user_manager_advanced": ResourceUserManagerAdvanced(), + "routeros_user_manager_attribute": ResourceUserManagerAttribute(), + "routeros_user_manager_database": ResourceUserManagerDatabase(), + "routeros_user_manager_limitation": ResourceUserManagerLimitation(), + "routeros_user_manager_profile": ResourceUserManagerProfile(), + "routeros_user_manager_profile_limitation": ResourceUserManagerProfileLimitation(), + "routeros_user_manager_router": ResourceUserManagerRouter(), + "routeros_user_manager_settings": ResourceUserManagerSettings(), + "routeros_user_manager_user": ResourceUserManagerUser(), + "routeros_user_manager_user_group": ResourceUserManagerUserGroup(), + "routeros_user_manager_user_profile": ResourceUserManagerUserProfile(), + + // WiFi + "routeros_wifi": ResourceWifi(), + "routeros_wifi_aaa": ResourceWifiAaa(), + "routeros_wifi_access_list": ResourceWifiAccessList(), + "routeros_wifi_cap": ResourceWifiCap(), + "routeros_wifi_capsman": ResourceWifiCapsman(), + "routeros_wifi_channel": ResourceWifiChannel(), + "routeros_wifi_configuration": ResourceWifiConfiguration(), + "routeros_wifi_datapath": ResourceWifiDatapath(), + "routeros_wifi_interworking": ResourceWifiInterworking(), + "routeros_wifi_provisioning": ResourceWifiProvisioning(), + "routeros_wifi_security": ResourceWifiSecurity(), + "routeros_wifi_steering": ResourceWifiSteering(), + + // ZeroTier + "routeros_zerotier": ResourceZerotier(), + "routeros_zerotier_controller": ResourceZerotierController(), + "routeros_zerotier_interface": ResourceZerotierInterface(), + }, + DataSourcesMap: map[string]*schema.Resource{ + "routeros_files": DatasourceFiles(), + "routeros_firewall": DatasourceFirewall(), + "routeros_interfaces": DatasourceInterfaces(), + "routeros_ip_addresses": DatasourceIPAddresses(), + "routeros_ip_arp": DatasourceIpArp(), + "routeros_ip_dhcp_server_leases": DatasourceIpDhcpServerLeases(), + "routeros_ip_routes": DatasourceIPRoutes(), + "routeros_ip_services": DatasourceIPServices(), + "routeros_ipv6_addresses": DatasourceIPv6Addresses(), + "routeros_system_resource": DatasourceSystemResource(), + "routeros_x509": DatasourceX509(), + }, + ConfigureContextFunc: NewClient, + } +} + +func NewProvider() *schema.Provider { + return Provider() +} From 1830fd006801fec69cc9fe433c8ccbae3bc0b14c Mon Sep 17 00:00:00 2001 From: Mircea-Pavel ANTON Date: Tue, 28 May 2024 18:39:31 +0000 Subject: [PATCH 04/10] add examples for the bandwidth server resource --- examples/resources/routeros_tool_bandwidth_server/import.sh | 1 + .../resources/routeros_tool_bandwidth_server/resource.tf | 6 ++++++ 2 files changed, 7 insertions(+) create mode 100644 examples/resources/routeros_tool_bandwidth_server/import.sh create mode 100644 examples/resources/routeros_tool_bandwidth_server/resource.tf diff --git a/examples/resources/routeros_tool_bandwidth_server/import.sh b/examples/resources/routeros_tool_bandwidth_server/import.sh new file mode 100644 index 00000000..3371890d --- /dev/null +++ b/examples/resources/routeros_tool_bandwidth_server/import.sh @@ -0,0 +1 @@ +terraform import routeros_tool_bandwidth_server.test . \ No newline at end of file diff --git a/examples/resources/routeros_tool_bandwidth_server/resource.tf b/examples/resources/routeros_tool_bandwidth_server/resource.tf new file mode 100644 index 00000000..f710cb4e --- /dev/null +++ b/examples/resources/routeros_tool_bandwidth_server/resource.tf @@ -0,0 +1,6 @@ +resource "routeros_tool_bandwidth_test_server" "test" { + enabled = true + authenticate = false + max_sessions = 100 + allocate_udp_ports_from = 2000 +} \ No newline at end of file From a2ea7e40d3c0e2a78f1dc0e39bd153df708a217f Mon Sep 17 00:00:00 2001 From: Mircea-Pavel ANTON Date: Tue, 28 May 2024 18:41:06 +0000 Subject: [PATCH 05/10] fix typo --- routeros/resource_tool_bandwidth_server.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routeros/resource_tool_bandwidth_server.go b/routeros/resource_tool_bandwidth_server.go index fdf4ed60..3bd87381 100644 --- a/routeros/resource_tool_bandwidth_server.go +++ b/routeros/resource_tool_bandwidth_server.go @@ -1,4 +1,4 @@ -tpackage routeros +package routeros import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" From cee299f7d271c048f0a81b4348f96309dc9aceaa Mon Sep 17 00:00:00 2001 From: Mircea-Pavel ANTON Date: Tue, 28 May 2024 18:42:22 +0000 Subject: [PATCH 06/10] fix function name --- routeros/resource_tool_bandwidth_server.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routeros/resource_tool_bandwidth_server.go b/routeros/resource_tool_bandwidth_server.go index 3bd87381..fb081686 100644 --- a/routeros/resource_tool_bandwidth_server.go +++ b/routeros/resource_tool_bandwidth_server.go @@ -11,7 +11,7 @@ import ( */ // https://help.mikrotik.com/docs/display/ROS/Bandwidth+Test -func ResourceToolMacServer() *schema.Resource { +func ResourceToolBandwidthServer() *schema.Resource { resSchema := map[string]*schema.Schema{ MetaResourcePath: PropResourcePath("/tool/bandwidth-server"), MetaId: PropId(Id), From 9888e46f487557c6c68cf5b1db428e47a4abcb60 Mon Sep 17 00:00:00 2001 From: Mircea-Pavel ANTON Date: Tue, 28 May 2024 18:42:56 +0000 Subject: [PATCH 07/10] generate docs for bandwidth server resource --- docs/resources/tool_bandwidth_server.md | 32 +++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 docs/resources/tool_bandwidth_server.md diff --git a/docs/resources/tool_bandwidth_server.md b/docs/resources/tool_bandwidth_server.md new file mode 100644 index 00000000..ad76337f --- /dev/null +++ b/docs/resources/tool_bandwidth_server.md @@ -0,0 +1,32 @@ +# routeros_tool_bandwidth_server (Resource) + + +## Example Usage +```terraform +resource "routeros_tool_bandwidth_test_server" "test" { + enabled = true + authenticate = false + max_sessions = 100 + allocate_udp_ports_from = 2000 +} +``` + + +## Schema + +### Optional + +- `allocate_udp_ports_from ` (Boolean) Beginning of UDP port range. +- `authenticate` (Boolean) Communicate only with authenticated clients. +- `enabled` (Boolean) Defines whether bandwidth server is enabled or not. +- `max_sessions ` (Number) Maximal simultaneous test count. + +### Read-Only + +- `id` (String) The ID of this resource. + +## Import +Import is supported using the following syntax: +```shell +terraform import routeros_tool_bandwidth_server.test . +``` From 3333aa8daa25414ef8ebc68feb67a91291a35ebe Mon Sep 17 00:00:00 2001 From: Vaerh Date: Wed, 29 May 2024 22:22:35 +0300 Subject: [PATCH 08/10] refactor: Small fixes to the added resource --- routeros/resource_tool_bandwidth_server.go | 115 +++++++++--------- .../resource_tool_bandwidth_server_test.go | 25 ++-- 2 files changed, 72 insertions(+), 68 deletions(-) diff --git a/routeros/resource_tool_bandwidth_server.go b/routeros/resource_tool_bandwidth_server.go index fb081686..0c936f63 100644 --- a/routeros/resource_tool_bandwidth_server.go +++ b/routeros/resource_tool_bandwidth_server.go @@ -1,57 +1,58 @@ -package routeros - -import ( - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" -) - -/* -{ - "allowed-interface-list": "LAN" -} -*/ - -// https://help.mikrotik.com/docs/display/ROS/Bandwidth+Test -func ResourceToolBandwidthServer() *schema.Resource { - resSchema := map[string]*schema.Schema{ - MetaResourcePath: PropResourcePath("/tool/bandwidth-server"), - MetaId: PropId(Id), - - "enabled": { - Type: schema.TypeBool, - Optional: true, - Default: true, - Description: "Defines whether bandwidth server is enabled or not.", - }, - "authenticate": { - Type: schema.TypeBool, - Optional: true, - Default: true, - Description: "Communicate only with authenticated clients.", - }, - "max_sessions ": { - Type: schema.TypeInt, - Optional: true, - Default: 100, - Description: "Maximal simultaneous test count.", - }, - "allocate_udp_ports_from ": { - Type: schema.TypeBool, - Optional: true, - Default: 2000, - Description: "Beginning of UDP port range.", - }, - } - - return &schema.Resource{ - CreateContext: DefaultSystemCreate(resSchema), - ReadContext: DefaultSystemRead(resSchema), - UpdateContext: DefaultSystemUpdate(resSchema), - DeleteContext: DefaultSystemDelete(resSchema), - - Importer: &schema.ResourceImporter{ - StateContext: schema.ImportStatePassthroughContext, - }, - - Schema: resSchema, - } -} +package routeros + +import ( + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" +) + +/* +{ + "allocate-udp-ports-from": "2000", + "authenticate": "true", + "enabled": "true", + "max-sessions": "100" +} +*/ + +// https://help.mikrotik.com/docs/display/ROS/Bandwidth+Test +func ResourceToolBandwidthServer() *schema.Resource { + resSchema := map[string]*schema.Schema{ + MetaResourcePath: PropResourcePath("/tool/bandwidth-server"), + MetaId: PropId(Id), + + "allocate_udp_ports_from": { + Type: schema.TypeInt, + Optional: true, + Description: "Beginning of UDP port range.", + ValidateFunc: validation.IntBetween(1000, 65535), + DiffSuppressFunc: AlwaysPresentNotUserProvided, + }, + "authenticate": { + Type: schema.TypeBool, + Optional: true, + Description: "Communicate only with authenticated clients.", + DiffSuppressFunc: AlwaysPresentNotUserProvided, + }, + KeyEnabled: PropEnabled("Defines whether bandwidth server is enabled or not."), + "max_sessions": { + Type: schema.TypeInt, + Optional: true, + Description: "Maximal simultaneous test count.", + ValidateFunc: validation.IntBetween(1, 1000), + DiffSuppressFunc: AlwaysPresentNotUserProvided, + }, + } + + return &schema.Resource{ + CreateContext: DefaultSystemCreate(resSchema), + ReadContext: DefaultSystemRead(resSchema), + UpdateContext: DefaultSystemUpdate(resSchema), + DeleteContext: DefaultSystemDelete(resSchema), + + Importer: &schema.ResourceImporter{ + StateContext: schema.ImportStatePassthroughContext, + }, + + Schema: resSchema, + } +} diff --git a/routeros/resource_tool_bandwidth_server_test.go b/routeros/resource_tool_bandwidth_server_test.go index c4c169fe..9fd1a3eb 100644 --- a/routeros/resource_tool_bandwidth_server_test.go +++ b/routeros/resource_tool_bandwidth_server_test.go @@ -19,16 +19,19 @@ func TestAccToolsBandwidthServerTest_basic(t *testing.T) { ProviderFactories: testAccProviderFactories, Steps: []resource.TestStep{ { - Config: testAccToolsBandwidthServerConfig_none("none"), + Config: testAccToolsBandwidthServerConfig_none(), Check: resource.ComposeTestCheckFunc( testResourcePrimaryInstanceId(testToolsBandwidthServer), - resource.TestCheckResourceAttr(testToolsBandwidthServer), + resource.TestCheckResourceAttr(testToolsBandwidthServer, "enabled", "false"), ), }, { - Config: testAccToolsBandwidthServerConfig_complex("all"), + Config: testAccToolsBandwidthServerConfig_complex(), Check: resource.ComposeTestCheckFunc( - resource.TestCheckResourceAttr(testToolsBandwidthServer), + resource.TestCheckResourceAttr(testToolsBandwidthServer, "enabled", "true"), + resource.TestCheckResourceAttr(testToolsBandwidthServer, "authenticate", "false"), + resource.TestCheckResourceAttr(testToolsBandwidthServer, "max_sessions", "100"), + resource.TestCheckResourceAttr(testToolsBandwidthServer, "allocate_udp_ports_from", "2000"), ), }, }, @@ -37,22 +40,22 @@ func TestAccToolsBandwidthServerTest_basic(t *testing.T) { } } -func testAccToolsBandwidthServerConfig_none(acl string) string { +func testAccToolsBandwidthServerConfig_none() string { return providerConfig + ` -resource "routeros_tool_bandwidth_test_server" "test" { +resource "routeros_tool_bandwidth_server" "test" { enabled = false } ` } -func testAccToolsBandwidthServerConfig_complex(acl string) string { +func testAccToolsBandwidthServerConfig_complex() string { return providerConfig + ` -resource "routeros_tool_bandwidth_test_server" "test" { - enabled = true - authenticate = false - max_sessions = 100 +resource "routeros_tool_bandwidth_server" "test" { + enabled = true + authenticate = false + max_sessions = 100 allocate_udp_ports_from = 2000 } ` From ed656cce1d75338b14a489fc60e2ad1020347d24 Mon Sep 17 00:00:00 2001 From: Vaerh Date: Wed, 29 May 2024 22:23:45 +0300 Subject: [PATCH 09/10] refactor: Add a helper for KeyEnabled --- routeros/provider_schema_helpers.go | 11 +++++++++++ routeros/resource_capsman_manager.go | 6 +----- routeros/resource_interface_wireless_cap.go | 6 +----- routeros/resource_ip_upnp.go | 6 +----- routeros/resource_ovpn_server.go | 6 +----- routeros/resource_snmp.go | 6 +----- routeros/resource_system_ntp_client.go | 7 +------ routeros/resource_system_ntp_server.go | 7 +------ routeros/resource_user_manager_settings.go | 7 +------ routeros/resource_wifi_cap.go | 8 ++------ routeros/resource_wifi_capsman.go | 6 +----- 11 files changed, 22 insertions(+), 54 deletions(-) diff --git a/routeros/provider_schema_helpers.go b/routeros/provider_schema_helpers.go index 8521c907..a2e7e28b 100644 --- a/routeros/provider_schema_helpers.go +++ b/routeros/provider_schema_helpers.go @@ -35,6 +35,7 @@ const ( KeyDisabled = "disabled" KeyDontFragment = "dont_fragment" KeyDscp = "dscp" + KeyEnabled = "enabled" KeyFilter = "filter" KeyInactive = "inactive" KeyInterface = "interface" @@ -154,6 +155,16 @@ func PropName(description string) *schema.Schema { } } +// PropEnabled +func PropEnabled(description string) *schema.Schema { + return &schema.Schema{ + Type: schema.TypeBool, + Optional: true, + Description: description, + DiffSuppressFunc: AlwaysPresentNotUserProvided, + } +} + // PropMacAddress func PropMacAddressRw(description string, required bool) *schema.Schema { mac := &schema.Schema{ diff --git a/routeros/resource_capsman_manager.go b/routeros/resource_capsman_manager.go index 82e54214..7834e4fb 100644 --- a/routeros/resource_capsman_manager.go +++ b/routeros/resource_capsman_manager.go @@ -37,11 +37,7 @@ func ResourceCapsManManager() *schema.Resource { Default: "none", Description: "Device certificate.", }, - "enabled": { - Type: schema.TypeBool, - Optional: true, - Description: "Disable or enable CAPsMAN functionality.", - }, + KeyEnabled: PropEnabled("Disable or enable CAPsMAN functionality."), "generated_ca_certificate": { Type: schema.TypeString, Computed: true, diff --git a/routeros/resource_interface_wireless_cap.go b/routeros/resource_interface_wireless_cap.go index d8336459..8669a45d 100644 --- a/routeros/resource_interface_wireless_cap.go +++ b/routeros/resource_interface_wireless_cap.go @@ -69,11 +69,7 @@ func ResourceInterfaceWirelessCap() *schema.Resource { Elem: &schema.Schema{Type: schema.TypeString}, Description: "List of interfaces over which CAP should attempt to discover CAPs Manager.", }, - "enabled": { - Type: schema.TypeBool, - Optional: true, - Description: "Disable or enable the CAP functionality.", - }, + KeyEnabled: PropEnabled("Disable or enable the CAP functionality."), "interfaces": { Type: schema.TypeSet, Optional: true, diff --git a/routeros/resource_ip_upnp.go b/routeros/resource_ip_upnp.go index 4bb274c4..1d67e20d 100644 --- a/routeros/resource_ip_upnp.go +++ b/routeros/resource_ip_upnp.go @@ -19,11 +19,7 @@ func ResourceUPNPSettings() *schema.Resource { "unwanted in UPnP deployments which the standard was not designed for (it was designed mostly for " + "home users to establish their own local networks), you can disable this behavior", }, - "enabled": { - Type: schema.TypeBool, - Optional: true, - Description: "Enable UPnP service.", - }, + KeyEnabled: PropEnabled("Enable UPnP service."), "show_dummy_rule": { Type: schema.TypeBool, Optional: true, diff --git a/routeros/resource_ovpn_server.go b/routeros/resource_ovpn_server.go index 1595b061..10fe096d 100644 --- a/routeros/resource_ovpn_server.go +++ b/routeros/resource_ovpn_server.go @@ -69,11 +69,7 @@ func ResourceOpenVPNServer() *schema.Resource { Optional: true, Description: "Specifies if IPv6 IP tunneling mode should be possible with this OVPN server.", }, - "enabled": { - Type: schema.TypeBool, - Optional: true, - Description: "Defines whether the OVPN server is enabled or not.", - }, + KeyEnabled: PropEnabled("Defines whether the OVPN server is enabled or not."), "ipv6_prefix_len": { Type: schema.TypeInt, Optional: true, diff --git a/routeros/resource_snmp.go b/routeros/resource_snmp.go index 6bcf8356..2cdbd6c0 100644 --- a/routeros/resource_snmp.go +++ b/routeros/resource_snmp.go @@ -32,11 +32,7 @@ func ResourceSNMP() *schema.Resource { Optional: true, Description: "Contact information.", }, - "enabled": { - Type: schema.TypeBool, - Required: true, - Description: "Used to disable/enable SNMP service", - }, + KeyEnabled: PropEnabled("Used to disable/enable SNMP service"), "engine_id": { Type: schema.TypeString, Computed: true, diff --git a/routeros/resource_system_ntp_client.go b/routeros/resource_system_ntp_client.go index f61fb7db..95860419 100644 --- a/routeros/resource_system_ntp_client.go +++ b/routeros/resource_system_ntp_client.go @@ -25,12 +25,7 @@ func ResourceSystemNtpClient() *schema.Resource { MetaResourcePath: PropResourcePath("/system/ntp/client"), MetaId: PropId(Id), - "enabled": { - Type: schema.TypeBool, - Optional: true, - Description: "Enable NTP client.", - DiffSuppressFunc: AlwaysPresentNotUserProvided, - }, + KeyEnabled: PropEnabled("Enable NTP client."), "freq_drift": { Type: schema.TypeString, Computed: true, diff --git a/routeros/resource_system_ntp_server.go b/routeros/resource_system_ntp_server.go index 6c18aa19..169aa501 100644 --- a/routeros/resource_system_ntp_server.go +++ b/routeros/resource_system_ntp_server.go @@ -43,12 +43,7 @@ func ResourceSystemNtpServer() *schema.Resource { Optional: true, Description: "Set broadcast address to use for NTP server broadcast mode.", }, - "enabled": { - Type: schema.TypeBool, - Optional: true, - Description: "Enable NTP server.", - DiffSuppressFunc: AlwaysPresentNotUserProvided, - }, + KeyEnabled: PropEnabled("Enable NTP server."), "local_clock_stratum": { Type: schema.TypeInt, Optional: true, diff --git a/routeros/resource_user_manager_settings.go b/routeros/resource_user_manager_settings.go index f84ced5c..518a8eef 100644 --- a/routeros/resource_user_manager_settings.go +++ b/routeros/resource_user_manager_settings.go @@ -41,12 +41,7 @@ func ResourceUserManagerSettings() *schema.Resource { Default: "none", Description: "Certificate for use in EAP TLS-type authentication methods.", }, - "enabled": { - Type: schema.TypeBool, - Optional: true, - Default: false, - Description: "An option whether the User Manager functionality is enabled.", - }, + KeyEnabled: PropEnabled("An option whether the User Manager functionality is enabled."), "use_profiles": { Type: schema.TypeBool, Optional: true, diff --git a/routeros/resource_wifi_cap.go b/routeros/resource_wifi_cap.go index c6aee38d..1fbaaf46 100644 --- a/routeros/resource_wifi_cap.go +++ b/routeros/resource_wifi_cap.go @@ -28,7 +28,7 @@ func ResourceWifiCap() *schema.Resource { "caps_man_addresses": { Type: schema.TypeList, Optional: true, - Elem: &schema.Schema{ + Elem: &schema.Schema{ Type: schema.TypeString, ValidateFunc: validation.IsIPAddress, }, @@ -57,11 +57,7 @@ func ResourceWifiCap() *schema.Resource { Elem: &schema.Schema{Type: schema.TypeString}, Description: "List of interfaces over which CAP should attempt to discover CAPs Manager.", }, - "enabled": { - Type: schema.TypeBool, - Optional: true, - Description: "Disable or enable the CAP functionality.", - }, + KeyEnabled: PropEnabled("Disable or enable the CAP functionality."), "lock_to_caps_man": { Type: schema.TypeBool, Optional: true, diff --git a/routeros/resource_wifi_capsman.go b/routeros/resource_wifi_capsman.go index 8c5815a2..9d1eddd0 100644 --- a/routeros/resource_wifi_capsman.go +++ b/routeros/resource_wifi_capsman.go @@ -35,11 +35,7 @@ func ResourceWifiCapsman() *schema.Resource { Optional: true, Description: "Device certificate.", }, - "enabled": { - Type: schema.TypeBool, - Optional: true, - Description: "Disable or enable CAPsMAN functionality.", - }, + KeyEnabled: PropEnabled("Disable or enable CAPsMAN functionality."), "generated_ca_certificate": { Type: schema.TypeString, Computed: true, From 3e2d7810e83d394e25d8703a2ce8b799e97c4ad7 Mon Sep 17 00:00:00 2001 From: Vaerh Date: Wed, 29 May 2024 22:38:10 +0300 Subject: [PATCH 10/10] fix: Resolve merge conflict --- routeros/provider.go | 608 ++++++++++++++++++++++--------------------- 1 file changed, 305 insertions(+), 303 deletions(-) diff --git a/routeros/provider.go b/routeros/provider.go index fb304860..b10e7b4e 100644 --- a/routeros/provider.go +++ b/routeros/provider.go @@ -1,303 +1,305 @@ -package routeros - -import ( - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" -) - -var ( - ErrorMsgPut = "An error was encountered while sending a PUT request to the API: %v" - ErrorMsgGet = "An error was encountered while sending a GET request to the API: %v" - ErrorMsgPatch = "An error was encountered while sending a PATCH request to the API: %v" - ErrorMsgDelete = "An error was encountered while sending a DELETE request to the API: %v" -) - -func Provider() *schema.Provider { - return &schema.Provider{ - Schema: map[string]*schema.Schema{ - "hosturl": { - Type: schema.TypeString, - Required: true, - DefaultFunc: schema.MultiEnvDefaultFunc( - []string{"ROS_HOSTURL", "MIKROTIK_HOST"}, - nil, - ), - Description: `URL of the MikroTik router, default is TLS connection to REST. - * API: api[s]://host[:port] - * api://router.local - * apis://router.local:8729 - * REST: http[s]://host - * http://router.local - * https://router.local - * router.local - * 127.0.0.1 - - - export ROS_HOSTURL=router.local or export MIKROTIK_HOST=router.local -`, - }, - "username": { - Type: schema.TypeString, - Required: true, - DefaultFunc: schema.MultiEnvDefaultFunc( - []string{"ROS_USERNAME", "MIKROTIK_USER"}, - nil, - ), - Description: `Username for the MikroTik WEB/Winbox. - - - export ROS_USERNAME=admin or export MIKROTIK_USER=admin -`, - }, - "password": { - Type: schema.TypeString, - Optional: true, - DefaultFunc: schema.MultiEnvDefaultFunc( - []string{"ROS_PASSWORD", "MIKROTIK_PASSWORD"}, - nil, - ), - Description: "Password for the MikroTik user.", - Sensitive: true, - }, - "ca_certificate": { - Type: schema.TypeString, - Optional: true, - DefaultFunc: schema.MultiEnvDefaultFunc( - []string{"ROS_CA_CERTIFICATE", "MIKROTIK_CA_CERTIFICATE"}, - nil, - ), - Description: "Path to MikroTik's certificate authority file.", - }, - "insecure": { - Type: schema.TypeBool, - Optional: true, - DefaultFunc: schema.MultiEnvDefaultFunc( - []string{"ROS_INSECURE", "MIKROTIK_INSECURE"}, - false, - ), - Description: "Whether to verify the SSL certificate or not.", - }, - }, - ResourcesMap: map[string]*schema.Resource{ - - // IP objects - "routeros_ip_dhcp_client": ResourceDhcpClient(), - "routeros_ip_dhcp_client_option": ResourceDhcpClientOption(), - "routeros_ip_dhcp_relay": ResourceDhcpRelay(), - "routeros_ip_dhcp_server": ResourceDhcpServer(), - "routeros_ip_dhcp_server_config": ResourceDhcpServerConfig(), - "routeros_ip_dhcp_server_network": ResourceDhcpServerNetwork(), - "routeros_ip_dhcp_server_lease": ResourceDhcpServerLease(), - "routeros_ip_dhcp_server_option": ResourceDhcpServerOption(), - "routeros_ip_dhcp_server_option_set": ResourceDhcpServerOptionSet(), - "routeros_ip_firewall_addr_list": ResourceIPFirewallAddrList(), - "routeros_ip_firewall_connection_tracking": ResourceIPConnectionTracking(), - "routeros_ip_firewall_filter": ResourceIPFirewallFilter(), - "routeros_ip_firewall_mangle": ResourceIPFirewallMangle(), - "routeros_ip_firewall_nat": ResourceIPFirewallNat(), - "routeros_ip_firewall_raw": ResourceIPFirewallRaw(), - "routeros_ip_address": ResourceIPAddress(), - "routeros_ip_pool": ResourceIPPool(), - "routeros_ip_route": ResourceIPRoute(), - "routeros_ip_dns": ResourceDns(), - "routeros_ip_dns_record": ResourceDnsRecord(), - "routeros_ip_service": ResourceIpService(), - "routeros_ip_neighbor_discovery_settings": ResourceIpNeighborDiscoverySettings(), - "routeros_ip_ssh_server": ResourceIpSSHServer(), - "routeros_ip_upnp": ResourceUPNPSettings(), - "routeros_ip_upnp_interfaces": ResourceUPNPInterfaces(), - "routeros_ip_vrf": ResourceIPVrf(), - "routeros_ipv6_address": ResourceIPv6Address(), - "routeros_ipv6_dhcp_client": ResourceIPv6DhcpClient(), - "routeros_ipv6_dhcp_client_option": ResourceIPv6DhcpClientOption(), - "routeros_ipv6_firewall_addr_list": ResourceIPv6FirewallAddrList(), - "routeros_ipv6_firewall_filter": ResourceIPv6FirewallFilter(), - "routeros_ipv6_neighbor_discovery": ResourceIPv6NeighborDiscovery(), - "routeros_ipv6_route": ResourceIPv6Route(), - - // Aliases for IP objects to retain compatibility between original and fork - "routeros_dhcp_client": ResourceDhcpClient(), - "routeros_dhcp_client_option": ResourceDhcpClientOption(), - "routeros_dhcp_server": ResourceDhcpServer(), - "routeros_dhcp_server_network": ResourceDhcpServerNetwork(), - "routeros_dhcp_server_lease": ResourceDhcpServerLease(), - "routeros_firewall_addr_list": ResourceIPFirewallAddrList(), - "routeros_firewall_filter": ResourceIPFirewallFilter(), - "routeros_firewall_mangle": ResourceIPFirewallMangle(), - "routeros_firewall_nat": ResourceIPFirewallNat(), - "routeros_dns": ResourceDns(), - "routeros_dns_record": ResourceDnsRecord(), - - // Interface Objects - "routeros_interface_bridge": ResourceInterfaceBridge(), - "routeros_interface_bridge_port": ResourceInterfaceBridgePort(), - "routeros_interface_bridge_vlan": ResourceInterfaceBridgeVlan(), - "routeros_interface_bridge_settings": ResourceInterfaceBridgeSettings(), - "routeros_interface_dot1x_client": ResourceInterfaceDot1xClient(), - "routeros_interface_dot1x_server": ResourceInterfaceDot1xServer(), - "routeros_interface_eoip": ResourceInterfaceEoip(), - "routeros_interface_ethernet_switch": ResourceInterfaceEthernetSwitch(), - "routeros_interface_ethernet_switch_host": ResourceInterfaceEthernetSwitchHost(), - "routeros_interface_ethernet_switch_port": ResourceInterfaceEthernetSwitchPort(), - "routeros_interface_ethernet_switch_port_isolation": ResourceInterfaceEthernetSwitchPortIsolation(), - "routeros_interface_ethernet_switch_vlan": ResourceInterfaceEthernetSwitchVlan(), - "routeros_interface_ethernet_switch_rule": ResourceInterfaceEthernetSwitchRule(), - "routeros_interface_gre": ResourceInterfaceGre(), - "routeros_interface_macvlan": ResourceInterfaceMacVlan(), - "routeros_interface_ipip": ResourceInterfaceIPIP(), - "routeros_interface_vlan": ResourceInterfaceVlan(), - "routeros_interface_vrrp": ResourceInterfaceVrrp(), - "routeros_interface_wireguard": ResourceInterfaceWireguard(), - "routeros_interface_wireguard_peer": ResourceInterfaceWireguardPeer(), - "routeros_interface_wireless_cap": ResourceInterfaceWirelessCap(), - "routeros_interface_list": ResourceInterfaceList(), - "routeros_interface_list_member": ResourceInterfaceListMember(), - "routeros_interface_ovpn_server": ResourceInterfaceOpenVPNServer(), - "routeros_interface_ovpn_client": ResourceOpenVPNClient(), - "routeros_interface_veth": ResourceInterfaceVeth(), - "routeros_interface_bonding": ResourceInterfaceBonding(), - "routeros_interface_pppoe_client": ResourceInterfacePPPoEClient(), - "routeros_interface_ethernet": ResourceInterfaceEthernet(), - - // Aliases for interface objects to retain compatibility between original and fork - "routeros_bridge": ResourceInterfaceBridge(), - "routeros_bridge_mlag": ResourceInterfaceBridgeMlag(), - "routeros_bridge_port": ResourceInterfaceBridgePort(), - "routeros_bridge_vlan": ResourceInterfaceBridgeVlan(), - "routeros_gre": ResourceInterfaceGre(), - "routeros_ipip": ResourceInterfaceIPIP(), - "routeros_vlan": ResourceInterfaceVlan(), - "routeros_vrrp": ResourceInterfaceVrrp(), - "routeros_wireguard": ResourceInterfaceWireguard(), - "routeros_wireguard_peer": ResourceInterfaceWireguardPeer(), - - // System Objects - "routeros_ip_cloud": ResourceIpCloud(), - "routeros_ip_cloud_advanced": ResourceIpCloudAdvanced(), - "routeros_system_certificate": ResourceSystemCertificate(), - "routeros_certificate_scep_server": ResourceCertificateScepServer(), - "routeros_system_clock": ResourceSystemClock(), - "routeros_system_identity": ResourceSystemIdentity(), - "routeros_system_logging": ResourceSystemLogging(), - "routeros_system_ntp_client": ResourceSystemNtpClient(), - "routeros_system_ntp_server": ResourceSystemNtpServer(), - "routeros_system_scheduler": ResourceSystemScheduler(), - "routeros_system_script": ResourceSystemScript(), - "routeros_system_user": ResourceUser(), - "routeros_system_user_aaa": ResourceUserAaa(), - "routeros_system_user_group": ResourceUserGroup(), - "routeros_system_user_settings": ResourceSystemUserSettings(), - - // Aliases for system objects to retain compatibility between original and fork - "routeros_identity": ResourceSystemIdentity(), - "routeros_scheduler": ResourceSystemScheduler(), - - // CAPsMAN Objects - "routeros_capsman_aaa": ResourceCapsManAaa(), - "routeros_capsman_access_list": ResourceCapsManAccessList(), - "routeros_capsman_channel": ResourceCapsManChannel(), - "routeros_capsman_configuration": ResourceCapsManConfiguration(), - "routeros_capsman_datapath": ResourceCapsManDatapath(), - "routeros_capsman_interface": ResourceCapsManInterface(), - "routeros_capsman_manager": ResourceCapsManManager(), - "routeros_capsman_manager_interface": ResourceCapsManManagerInterface(), - "routeros_capsman_provisioning": ResourceCapsManProvisioning(), - "routeros_capsman_rates": ResourceCapsManRates(), - "routeros_capsman_security": ResourceCapsManSecurity(), - - // Container objects - "routeros_container": ResourceContainer(), - "routeros_container_config": ResourceContainerConfig(), - "routeros_container_envs": ResourceContainerEnvs(), - "routeros_container_mounts": ResourceContainerMounts(), - - // File objects - "routeros_file": ResourceFile(), - - // Routing - "routeros_routing_bgp_connection": ResourceRoutingBGPConnection(), - "routeros_routing_bgp_template": ResourceRoutingBGPTemplate(), - "routeros_routing_filter_rule": ResourceRoutingFilterRule(), - "routeros_routing_table": ResourceRoutingTable(), - - // OSPF - "routeros_routing_ospf_instance": ResourceRoutingOspfInstance(), - "routeros_routing_ospf_area": ResourceRoutingOspfArea(), - "routeros_routing_ospf_interface_template": ResourceRoutingOspfInterfaceTemplate(), - - // VPN - "routeros_ovpn_server": ResourceOpenVPNServer(), - - // PPP - "routeros_ppp_aaa": ResourcePppAaa(), - "routeros_ppp_profile": ResourcePPPProfile(), - "routeros_ppp_secret": ResourcePPPSecret(), - - // RADIUS - "routeros_radius": ResourceRadius(), - "routeros_radius_incoming": ResourceRadiusIncoming(), - - // SNMP - "routeros_snmp": ResourceSNMP(), - "routeros_snmp_community": ResourceSNMPCommunity(), - - // Helpers - "routeros_wireguard_keys": ResourceWireguardKeys(), - "routeros_move_items": ResourceMoveItems(), - - // Tools - "routeros_tool_bandwidth_server": ResourceToolBandwidthServer(), - "routeros_tool_mac_server": ResourceToolMacServer(), - "routeros_tool_mac_server_winbox": ResourceToolMacServerWinBox(), - - // User Manager - "routeros_user_manager_advanced": ResourceUserManagerAdvanced(), - "routeros_user_manager_attribute": ResourceUserManagerAttribute(), - "routeros_user_manager_database": ResourceUserManagerDatabase(), - "routeros_user_manager_limitation": ResourceUserManagerLimitation(), - "routeros_user_manager_profile": ResourceUserManagerProfile(), - "routeros_user_manager_profile_limitation": ResourceUserManagerProfileLimitation(), - "routeros_user_manager_router": ResourceUserManagerRouter(), - "routeros_user_manager_settings": ResourceUserManagerSettings(), - "routeros_user_manager_user": ResourceUserManagerUser(), - "routeros_user_manager_user_group": ResourceUserManagerUserGroup(), - "routeros_user_manager_user_profile": ResourceUserManagerUserProfile(), - - // WiFi - "routeros_wifi": ResourceWifi(), - "routeros_wifi_aaa": ResourceWifiAaa(), - "routeros_wifi_access_list": ResourceWifiAccessList(), - "routeros_wifi_cap": ResourceWifiCap(), - "routeros_wifi_capsman": ResourceWifiCapsman(), - "routeros_wifi_channel": ResourceWifiChannel(), - "routeros_wifi_configuration": ResourceWifiConfiguration(), - "routeros_wifi_datapath": ResourceWifiDatapath(), - "routeros_wifi_interworking": ResourceWifiInterworking(), - "routeros_wifi_provisioning": ResourceWifiProvisioning(), - "routeros_wifi_security": ResourceWifiSecurity(), - "routeros_wifi_steering": ResourceWifiSteering(), - - // ZeroTier - "routeros_zerotier": ResourceZerotier(), - "routeros_zerotier_controller": ResourceZerotierController(), - "routeros_zerotier_interface": ResourceZerotierInterface(), - }, - DataSourcesMap: map[string]*schema.Resource{ - "routeros_files": DatasourceFiles(), - "routeros_firewall": DatasourceFirewall(), - "routeros_interfaces": DatasourceInterfaces(), - "routeros_ip_addresses": DatasourceIPAddresses(), - "routeros_ip_arp": DatasourceIpArp(), - "routeros_ip_dhcp_server_leases": DatasourceIpDhcpServerLeases(), - "routeros_ip_routes": DatasourceIPRoutes(), - "routeros_ip_services": DatasourceIPServices(), - "routeros_ipv6_addresses": DatasourceIPv6Addresses(), - "routeros_system_resource": DatasourceSystemResource(), - "routeros_x509": DatasourceX509(), - }, - ConfigureContextFunc: NewClient, - } -} - -func NewProvider() *schema.Provider { - return Provider() -} +package routeros + +import ( + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" +) + +var ( + ErrorMsgPut = "An error was encountered while sending a PUT request to the API: %v" + ErrorMsgGet = "An error was encountered while sending a GET request to the API: %v" + ErrorMsgPatch = "An error was encountered while sending a PATCH request to the API: %v" + ErrorMsgDelete = "An error was encountered while sending a DELETE request to the API: %v" +) + +func Provider() *schema.Provider { + return &schema.Provider{ + Schema: map[string]*schema.Schema{ + "hosturl": { + Type: schema.TypeString, + Required: true, + DefaultFunc: schema.MultiEnvDefaultFunc( + []string{"ROS_HOSTURL", "MIKROTIK_HOST"}, + nil, + ), + Description: `URL of the MikroTik router, default is TLS connection to REST. + * API: api[s]://host[:port] + * api://router.local + * apis://router.local:8729 + * REST: http[s]://host + * http://router.local + * https://router.local + * router.local + * 127.0.0.1 + + + export ROS_HOSTURL=router.local or export MIKROTIK_HOST=router.local +`, + }, + "username": { + Type: schema.TypeString, + Required: true, + DefaultFunc: schema.MultiEnvDefaultFunc( + []string{"ROS_USERNAME", "MIKROTIK_USER"}, + nil, + ), + Description: `Username for the MikroTik WEB/Winbox. + + + export ROS_USERNAME=admin or export MIKROTIK_USER=admin +`, + }, + "password": { + Type: schema.TypeString, + Optional: true, + DefaultFunc: schema.MultiEnvDefaultFunc( + []string{"ROS_PASSWORD", "MIKROTIK_PASSWORD"}, + nil, + ), + Description: "Password for the MikroTik user.", + Sensitive: true, + }, + "ca_certificate": { + Type: schema.TypeString, + Optional: true, + DefaultFunc: schema.MultiEnvDefaultFunc( + []string{"ROS_CA_CERTIFICATE", "MIKROTIK_CA_CERTIFICATE"}, + nil, + ), + Description: "Path to MikroTik's certificate authority file.", + }, + "insecure": { + Type: schema.TypeBool, + Optional: true, + DefaultFunc: schema.MultiEnvDefaultFunc( + []string{"ROS_INSECURE", "MIKROTIK_INSECURE"}, + false, + ), + Description: "Whether to verify the SSL certificate or not.", + }, + }, + ResourcesMap: map[string]*schema.Resource{ + + // IP objects + "routeros_ip_dhcp_client": ResourceDhcpClient(), + "routeros_ip_dhcp_client_option": ResourceDhcpClientOption(), + "routeros_ip_dhcp_relay": ResourceDhcpRelay(), + "routeros_ip_dhcp_server": ResourceDhcpServer(), + "routeros_ip_dhcp_server_config": ResourceDhcpServerConfig(), + "routeros_ip_dhcp_server_network": ResourceDhcpServerNetwork(), + "routeros_ip_dhcp_server_lease": ResourceDhcpServerLease(), + "routeros_ip_dhcp_server_option": ResourceDhcpServerOption(), + "routeros_ip_dhcp_server_option_set": ResourceDhcpServerOptionSet(), + "routeros_ip_firewall_addr_list": ResourceIPFirewallAddrList(), + "routeros_ip_firewall_connection_tracking": ResourceIPConnectionTracking(), + "routeros_ip_firewall_filter": ResourceIPFirewallFilter(), + "routeros_ip_firewall_mangle": ResourceIPFirewallMangle(), + "routeros_ip_firewall_nat": ResourceIPFirewallNat(), + "routeros_ip_firewall_raw": ResourceIPFirewallRaw(), + "routeros_ip_address": ResourceIPAddress(), + "routeros_ip_pool": ResourceIPPool(), + "routeros_ip_route": ResourceIPRoute(), + "routeros_ip_dns": ResourceDns(), + "routeros_ip_dns_record": ResourceDnsRecord(), + "routeros_ip_service": ResourceIpService(), + "routeros_ip_neighbor_discovery_settings": ResourceIpNeighborDiscoverySettings(), + "routeros_ip_ssh_server": ResourceIpSSHServer(), + "routeros_ip_upnp": ResourceUPNPSettings(), + "routeros_ip_upnp_interfaces": ResourceUPNPInterfaces(), + "routeros_ip_vrf": ResourceIPVrf(), + "routeros_ipv6_address": ResourceIPv6Address(), + "routeros_ipv6_dhcp_client": ResourceIPv6DhcpClient(), + "routeros_ipv6_dhcp_client_option": ResourceIPv6DhcpClientOption(), + "routeros_ipv6_firewall_addr_list": ResourceIPv6FirewallAddrList(), + "routeros_ipv6_firewall_filter": ResourceIPv6FirewallFilter(), + "routeros_ipv6_neighbor_discovery": ResourceIPv6NeighborDiscovery(), + "routeros_ipv6_route": ResourceIPv6Route(), + + // Aliases for IP objects to retain compatibility between original and fork + "routeros_dhcp_client": ResourceDhcpClient(), + "routeros_dhcp_client_option": ResourceDhcpClientOption(), + "routeros_dhcp_server": ResourceDhcpServer(), + "routeros_dhcp_server_network": ResourceDhcpServerNetwork(), + "routeros_dhcp_server_lease": ResourceDhcpServerLease(), + "routeros_firewall_addr_list": ResourceIPFirewallAddrList(), + "routeros_firewall_filter": ResourceIPFirewallFilter(), + "routeros_firewall_mangle": ResourceIPFirewallMangle(), + "routeros_firewall_nat": ResourceIPFirewallNat(), + "routeros_dns": ResourceDns(), + "routeros_dns_record": ResourceDnsRecord(), + + // Interface Objects + "routeros_interface_bridge": ResourceInterfaceBridge(), + "routeros_interface_bridge_port": ResourceInterfaceBridgePort(), + "routeros_interface_bridge_vlan": ResourceInterfaceBridgeVlan(), + "routeros_interface_bridge_settings": ResourceInterfaceBridgeSettings(), + "routeros_interface_dot1x_client": ResourceInterfaceDot1xClient(), + "routeros_interface_dot1x_server": ResourceInterfaceDot1xServer(), + "routeros_interface_eoip": ResourceInterfaceEoip(), + "routeros_interface_ethernet_switch": ResourceInterfaceEthernetSwitch(), + "routeros_interface_ethernet_switch_host": ResourceInterfaceEthernetSwitchHost(), + "routeros_interface_ethernet_switch_port": ResourceInterfaceEthernetSwitchPort(), + "routeros_interface_ethernet_switch_port_isolation": ResourceInterfaceEthernetSwitchPortIsolation(), + "routeros_interface_ethernet_switch_vlan": ResourceInterfaceEthernetSwitchVlan(), + "routeros_interface_ethernet_switch_rule": ResourceInterfaceEthernetSwitchRule(), + "routeros_interface_gre": ResourceInterfaceGre(), + "routeros_interface_macvlan": ResourceInterfaceMacVlan(), + "routeros_interface_ipip": ResourceInterfaceIPIP(), + "routeros_interface_vlan": ResourceInterfaceVlan(), + "routeros_interface_vrrp": ResourceInterfaceVrrp(), + "routeros_interface_wireguard": ResourceInterfaceWireguard(), + "routeros_interface_wireguard_peer": ResourceInterfaceWireguardPeer(), + "routeros_interface_wireless_cap": ResourceInterfaceWirelessCap(), + "routeros_interface_list": ResourceInterfaceList(), + "routeros_interface_list_member": ResourceInterfaceListMember(), + "routeros_interface_ovpn_server": ResourceInterfaceOpenVPNServer(), + "routeros_interface_ovpn_client": ResourceOpenVPNClient(), + "routeros_interface_veth": ResourceInterfaceVeth(), + "routeros_interface_bonding": ResourceInterfaceBonding(), + "routeros_interface_pppoe_client": ResourceInterfacePPPoEClient(), + "routeros_interface_ethernet": ResourceInterfaceEthernet(), + + // Aliases for interface objects to retain compatibility between original and fork + "routeros_bridge": ResourceInterfaceBridge(), + "routeros_bridge_mlag": ResourceInterfaceBridgeMlag(), + "routeros_bridge_port": ResourceInterfaceBridgePort(), + "routeros_bridge_vlan": ResourceInterfaceBridgeVlan(), + "routeros_gre": ResourceInterfaceGre(), + "routeros_ipip": ResourceInterfaceIPIP(), + "routeros_vlan": ResourceInterfaceVlan(), + "routeros_vrrp": ResourceInterfaceVrrp(), + "routeros_wireguard": ResourceInterfaceWireguard(), + "routeros_wireguard_peer": ResourceInterfaceWireguardPeer(), + + // System Objects + "routeros_ip_cloud": ResourceIpCloud(), + "routeros_ip_cloud_advanced": ResourceIpCloudAdvanced(), + "routeros_system_certificate": ResourceSystemCertificate(), + "routeros_system_certificate_scep_server": ResourceCertificateScepServer(), + "routeros_certificate_scep_server": ResourceCertificateScepServer(), + "routeros_system_clock": ResourceSystemClock(), + "routeros_system_identity": ResourceSystemIdentity(), + "routeros_system_logging": ResourceSystemLogging(), + "routeros_system_logging_action": ResourceSystemLoggingAction(), + "routeros_system_ntp_client": ResourceSystemNtpClient(), + "routeros_system_ntp_server": ResourceSystemNtpServer(), + "routeros_system_scheduler": ResourceSystemScheduler(), + "routeros_system_script": ResourceSystemScript(), + "routeros_system_user": ResourceUser(), + "routeros_system_user_aaa": ResourceUserAaa(), + "routeros_system_user_group": ResourceUserGroup(), + "routeros_system_user_settings": ResourceSystemUserSettings(), + + // Aliases for system objects to retain compatibility between original and fork + "routeros_identity": ResourceSystemIdentity(), + "routeros_scheduler": ResourceSystemScheduler(), + + // CAPsMAN Objects + "routeros_capsman_aaa": ResourceCapsManAaa(), + "routeros_capsman_access_list": ResourceCapsManAccessList(), + "routeros_capsman_channel": ResourceCapsManChannel(), + "routeros_capsman_configuration": ResourceCapsManConfiguration(), + "routeros_capsman_datapath": ResourceCapsManDatapath(), + "routeros_capsman_interface": ResourceCapsManInterface(), + "routeros_capsman_manager": ResourceCapsManManager(), + "routeros_capsman_manager_interface": ResourceCapsManManagerInterface(), + "routeros_capsman_provisioning": ResourceCapsManProvisioning(), + "routeros_capsman_rates": ResourceCapsManRates(), + "routeros_capsman_security": ResourceCapsManSecurity(), + + // Container objects + "routeros_container": ResourceContainer(), + "routeros_container_config": ResourceContainerConfig(), + "routeros_container_envs": ResourceContainerEnvs(), + "routeros_container_mounts": ResourceContainerMounts(), + + // File objects + "routeros_file": ResourceFile(), + + // Routing + "routeros_routing_bgp_connection": ResourceRoutingBGPConnection(), + "routeros_routing_bgp_template": ResourceRoutingBGPTemplate(), + "routeros_routing_filter_rule": ResourceRoutingFilterRule(), + "routeros_routing_table": ResourceRoutingTable(), + + // OSPF + "routeros_routing_ospf_instance": ResourceRoutingOspfInstance(), + "routeros_routing_ospf_area": ResourceRoutingOspfArea(), + "routeros_routing_ospf_interface_template": ResourceRoutingOspfInterfaceTemplate(), + + // VPN + "routeros_ovpn_server": ResourceOpenVPNServer(), + + // PPP + "routeros_ppp_aaa": ResourcePppAaa(), + "routeros_ppp_profile": ResourcePPPProfile(), + "routeros_ppp_secret": ResourcePPPSecret(), + + // RADIUS + "routeros_radius": ResourceRadius(), + "routeros_radius_incoming": ResourceRadiusIncoming(), + + // SNMP + "routeros_snmp": ResourceSNMP(), + "routeros_snmp_community": ResourceSNMPCommunity(), + + // Helpers + "routeros_wireguard_keys": ResourceWireguardKeys(), + "routeros_move_items": ResourceMoveItems(), + + // Tools + "routeros_tool_bandwidth_server": ResourceToolBandwidthServer(), + "routeros_tool_mac_server": ResourceToolMacServer(), + "routeros_tool_mac_server_winbox": ResourceToolMacServerWinBox(), + + // User Manager + "routeros_user_manager_advanced": ResourceUserManagerAdvanced(), + "routeros_user_manager_attribute": ResourceUserManagerAttribute(), + "routeros_user_manager_database": ResourceUserManagerDatabase(), + "routeros_user_manager_limitation": ResourceUserManagerLimitation(), + "routeros_user_manager_profile": ResourceUserManagerProfile(), + "routeros_user_manager_profile_limitation": ResourceUserManagerProfileLimitation(), + "routeros_user_manager_router": ResourceUserManagerRouter(), + "routeros_user_manager_settings": ResourceUserManagerSettings(), + "routeros_user_manager_user": ResourceUserManagerUser(), + "routeros_user_manager_user_group": ResourceUserManagerUserGroup(), + "routeros_user_manager_user_profile": ResourceUserManagerUserProfile(), + + // WiFi + "routeros_wifi": ResourceWifi(), + "routeros_wifi_aaa": ResourceWifiAaa(), + "routeros_wifi_access_list": ResourceWifiAccessList(), + "routeros_wifi_cap": ResourceWifiCap(), + "routeros_wifi_capsman": ResourceWifiCapsman(), + "routeros_wifi_channel": ResourceWifiChannel(), + "routeros_wifi_configuration": ResourceWifiConfiguration(), + "routeros_wifi_datapath": ResourceWifiDatapath(), + "routeros_wifi_interworking": ResourceWifiInterworking(), + "routeros_wifi_provisioning": ResourceWifiProvisioning(), + "routeros_wifi_security": ResourceWifiSecurity(), + "routeros_wifi_steering": ResourceWifiSteering(), + + // ZeroTier + "routeros_zerotier": ResourceZerotier(), + "routeros_zerotier_controller": ResourceZerotierController(), + "routeros_zerotier_interface": ResourceZerotierInterface(), + }, + DataSourcesMap: map[string]*schema.Resource{ + "routeros_files": DatasourceFiles(), + "routeros_firewall": DatasourceFirewall(), + "routeros_interfaces": DatasourceInterfaces(), + "routeros_ip_addresses": DatasourceIPAddresses(), + "routeros_ip_arp": DatasourceIpArp(), + "routeros_ip_dhcp_server_leases": DatasourceIpDhcpServerLeases(), + "routeros_ip_routes": DatasourceIPRoutes(), + "routeros_ip_services": DatasourceIPServices(), + "routeros_ipv6_addresses": DatasourceIPv6Addresses(), + "routeros_system_resource": DatasourceSystemResource(), + "routeros_x509": DatasourceX509(), + }, + ConfigureContextFunc: NewClient, + } +} + +func NewProvider() *schema.Provider { + return Provider() +}