Files
ubicloud/routes/project/private_location.rb
Furkan Sahin f85be7e4c5 Integrate PG with AWS instance sizes
On the AWS side, we are limited on the VM size configuration with disk
sizes. Therefore, we are introducing the limitations here. We are also
making only standard SKU available. For now, we will only support a
single disk size per instance size which also is supported up to 16
vcpu.
2025-04-02 12:34:20 +02:00

116 lines
3.3 KiB
Ruby

# frozen_string_literal: true
class Clover
hash_branch(:project_prefix, "private-location") do |r|
r.get true do
authorize("Location:view", @project.id)
@dataset = @project.locations_dataset
if api?
result = @dataset.paginated_result(
start_after: r.params["start_after"],
page_size: r.params["page_size"],
order_column: r.params["order_column"]
)
{
items: Serializers::PrivateLocation.serialize(result[:records]),
count: result[:count]
}
else
@locations = @dataset.all
view "private-location/index"
end
end
r.post true do
authorize("Location:create", @project.id)
required_parameters = ["name", "provider_location_name", "access_key", "secret_key"]
request_body_params = validate_request_params(required_parameters)
Validation.validate_name(request_body_params["name"])
Validation.validate_provider_location_name("aws", request_body_params["provider_location_name"])
loc = DB.transaction do
loc = Location.create(
display_name: request_body_params["name"],
name: request_body_params["provider_location_name"],
ui_name: request_body_params["name"],
visible: true,
provider: "aws",
project_id: @project.id
)
LocationCredential.create(
access_key: request_body_params["access_key"],
secret_key: request_body_params["secret_key"]
) { _1.id = loc.id }
loc
end
if api?
Serializers::PrivateLocation.serialize(loc)
else
r.redirect "#{@project.path}#{loc.path}"
end
end
r.get(web?, "create") do
authorize("Location:create", @project.id)
options = OptionTreeGenerator.new
options.add_option(name: "name")
options.add_option(name: "provider_location_name", values: Option::AWS_LOCATIONS.map { |l| {value: l, display_name: l} })
options.add_option(name: "access_key")
options.add_option(name: "secret_key")
@option_tree, @option_parents = options.serialize
view "private-location/create"
end
r.is String do |name|
@location = @project.locations.find { |loc| loc.ui_name == name }
next(r.delete? ? 204 : 404) unless @location
r.get do
authorize("Location:view", @project.id)
if api?
Serializers::PrivateLocation.serialize(@location)
else
view "private-location/show"
end
end
r.delete do
authorize("Location:delete", @project.id)
if @location.has_resources
fail DependencyError.new("Private location '#{@location.ui_name}' has some resources, first, delete them.")
end
DB.transaction do
@location.location_credential.destroy
@location.destroy
end
204
end
r.post do
authorize("Location:edit", @project.id)
Validation.validate_name(r.params["name"])
@location.update(ui_name: r.params["name"], display_name: r.params["name"])
if api?
Serializers::PrivateLocation.serialize(@location)
else
flash["notice"] = "The location name is updated to '#{@location.ui_name}'."
r.redirect "#{@project.path}#{@location.path}"
end
end
end
end
end