require "helpers/integration_test_helper"
require "securerandom"

class TestComputeNetworksCollection < FogIntegrationTest
  DEFAULT_REGION = "us-central1".freeze
  DEFAULT_ZONE = "us-central1-b".freeze
  RESOURCE_PREFIX = "fog-test-networkscol".freeze

  # Ensure we clean up any created resources
  Minitest.after_run do
    client = Fog::Compute::Google.new
    client.networks.each { |a| a.destroy if a.name.start_with?(RESOURCE_PREFIX) }
    client.servers.each { |s| s.destroy if s.name.start_with?(RESOURCE_PREFIX) }
  end

  def test_network_workflow
    client = Fog::Compute::Google.new

    my_network_name = new_resource_name
    # An address can be created by specifying a name and a region
    my_network = client.networks.create(
      :name => my_network_name,
      :ipv4_range => "10.240.#{rand(255)}.0/24"
    )

    assert_equal(my_network_name, my_network.name, "My network should have the provided name")

    # It should also be visible when listing addresses
    assert_includes(client.networks.all.map(&:name), my_network_name)

    # Be aware that although the address resource is created, it might not yet
    # have an ip address. You can poll until the address has been assigned.
    my_network.wait_for { !my_network.ipv4_range.nil? }
    assert_match(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}/,
                 my_network.ipv4_range,
                 "My address's address should have a valid ipv4 address")

    # Now that we have an address, we can create a server using the static ip
    server_name = new_resource_name
    client.servers.create(
      :name => server_name,
      :machine_type => "f1-micro",
      :zone => client.zones.get(DEFAULT_ZONE).self_link,
      :disks => [
        :boot => true,
        :auto_delete => true,
        :initialize_params => {
          :source_image => "projects/debian-cloud/global/images/family/debian-8"
        }
      ],
      :network_interfaces => [my_network.get_as_interface_config]
    ).wait_for { ready? }

    my_server = client.servers.get(server_name, DEFAULT_ZONE)
    # We need to verify that the network has been correctly assigned
    assert_equal(
      my_network.self_link,
      my_server.network_interfaces[0][:network],
      "My created server should have the network specified as the network"
    )
  end

  def new_resource_name
    "#{RESOURCE_PREFIX}-#{SecureRandom.uuid}"
  end
end