Allow users to cancel a running crunch job by updating cancelled_at
[arvados.git] / sdk / perl / lib / Arvados / ResourceMethod.pm
index eecc041c65f5fbbf69cb0c8f5eabdc8fe4959b2e..fd577752b2c706324e1cd4c688ace24ff333938a 100644 (file)
@@ -27,7 +27,9 @@ sub execute
 
     my %body_params;
     my %given_params = @_;
+    my %extra_params = %given_params;
     while (my ($param_name, $param) = each %{$method->{'parameters'}}) {
+        delete $extra_params{$param_name};
         if ($param->{'required'} && !exists $given_params{$param_name}) {
             croak("Required parameter not supplied: $param_name");
         }
@@ -48,7 +50,7 @@ sub execute
                     if (!exists $given_params{$param_name}->{$property_name}) {
                         ;
                     }
-                    elsif ($given_params{$param_name}->{$property_name} eq undef) {
+                    elsif (!defined $given_params{$param_name}->{$property_name}) {
                         $param_value{$property_name} = JSON::null;
                     }
                     elsif ($property->{'type'} eq 'boolean') {
@@ -74,8 +76,13 @@ sub execute
             $body_params{$param_name} = $given_params{$param_name};
         }
     }
+    if (%extra_params) {
+        croak("Unsupported parameter(s) passed to API call /$path: \"" . join('", "', keys %extra_params) . '"');
+    }
     my $r = $self->{'resourceAccessor'}->{'api'}->new_request;
-    $r->set_uri($self->{'resourceAccessor'}->{'api'}->{'discoveryDocument'}->{'baseUrl'} . "/" . $path);
+    my $base_uri = $self->{'resourceAccessor'}->{'api'}->{'discoveryDocument'}->{'baseUrl'};
+    $base_uri =~ s:/$::;
+    $r->set_uri($base_uri . "/" . $path);
     $r->set_method($method->{'httpMethod'});
     $r->set_auth_token($self->{'resourceAccessor'}->{'api'}->{'authToken'});
     $r->set_query_params(\%body_params) if %body_params;
@@ -83,7 +90,7 @@ sub execute
     my $data, $headers;
     my ($status_number, $status_phrase) = $r->get_status();
     if ($status_number != 200) {
-        croak("API call failed: $status_number $status_phrase\n". $r->get_body());
+        croak("API call /$path failed: $status_number $status_phrase\n". $r->get_body());
     }
     $data = $r->get_body();
     $headers = $r->get_headers();