Files
ubicloud/routes/project/location/private_subnet.rb
Jeremy Evans d4bb9e8619 Allow access to objects in internal locations in web/api routes
However, do not allow creation of objects in internal locations
in web/api routes.

Show helpful error message if using an invalid location in the api.
This error message shows what the problem is, and the available
valid locations the user can use.
2025-03-25 11:48:42 -07:00

107 lines
3.3 KiB
Ruby

# frozen_string_literal: true
class Clover
hash_branch(:project_location_prefix, "private-subnet") do |r|
r.get api? do
private_subnet_list
end
r.on PRIVATE_SUBNET_NAME_OR_UBID do |ps_name, ps_id|
if ps_name
r.post true do
check_visible_location
private_subnet_post(ps_name)
end
filter = {Sequel[:private_subnet][:name] => ps_name}
else
filter = {Sequel[:private_subnet][:id] => UBID.to_uuid(ps_id)}
end
filter[:location_id] = @location.id
ps = @project.private_subnets_dataset.eager(:location).first(filter)
next (r.delete? ? 204 : 404) unless ps
r.post "connect" do
authorize("PrivateSubnet:connect", ps.id)
subnet = PrivateSubnet.from_ubid(r.params["connected-subnet-ubid"])
unless subnet
if api?
response.status = 400
next {error: {code: 400, type: "InvalidRequest", message: "Subnet to be connected not found"}}
else
flash["error"] = "Subnet to be connected not found"
r.redirect "#{@project.path}#{ps.path}"
end
end
authorize("PrivateSubnet:connect", subnet.id)
ps.connect_subnet(subnet)
if api?
Serializers::PrivateSubnet.serialize(ps)
else
flash["notice"] = "#{subnet.name} will be connected in a few seconds"
r.redirect "#{@project.path}#{ps.path}"
end
end
r.post "disconnect", String do |disconnecting_ps_ubid|
authorize("PrivateSubnet:disconnect", ps.id)
subnet = PrivateSubnet.from_ubid(disconnecting_ps_ubid)
unless subnet
response.status = 400
next {error: {code: 400, type: "InvalidRequest", message: "Subnet to be disconnected not found"}}
end
authorize("PrivateSubnet:disconnect", subnet.id)
ps.disconnect_subnet(subnet)
if api?
Serializers::PrivateSubnet.serialize(ps)
else
flash["notice"] = "#{subnet.name} will be disconnected in a few seconds"
204
end
end
request.get true do
authorize("PrivateSubnet:view", ps.id)
@ps = Serializers::PrivateSubnet.serialize(ps)
if api?
@ps
else
@nics = Serializers::Nic.serialize(ps.nics)
@connected_subnets = Serializers::PrivateSubnet.serialize(ps.connected_subnets)
connectable_subnets = ps.project.private_subnets.select do |ps1|
ps1_id = ps1.id
ps1_id != ps.id && !ps.connected_subnets.find { |cs| cs.id == ps1_id }
end
@connectable_subnets = Serializers::PrivateSubnet.serialize(connectable_subnets)
view "networking/private_subnet/show"
end
end
request.delete true do
authorize("PrivateSubnet:delete", ps.id)
unless ps.vms.all? { _1.destroy_set? || _1.strand.nil? || _1.strand.label == "destroy" }
fail DependencyError.new("Private subnet '#{ps.name}' has VMs attached, first, delete them.")
end
ps.incr_destroy
204
end
end
# 204 response for invalid names
r.is String do |ps_name|
r.post do
private_subnet_post(ps_name)
end
r.delete do
204
end
end
end
end