// Copyright 2016 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

syntax = "proto3";

package google.appengine.v1;

import "google/api/annotations.proto";
import "google/protobuf/timestamp.proto";

option go_package = "google.golang.org/genproto/googleapis/appengine/v1;appengine";
option java_multiple_files = true;
option java_outer_classname = "OperationProto";
option java_package = "com.google.appengine.v1";


// Metadata for the given [google.longrunning.Operation][google.longrunning.Operation].
message OperationMetadataV1 {
  // API method that initiated this operation. Example:
  // `google.appengine.v1.Versions.CreateVersion`.
  //
  // @OutputOnly
  string method = 1;

  // Time that this operation was created.
  //
  // @OutputOnly
  google.protobuf.Timestamp insert_time = 2;

  // Time that this operation completed.
  //
  // @OutputOnly
  google.protobuf.Timestamp end_time = 3;

  // User who requested this operation.
  //
  // @OutputOnly
  string user = 4;

  // Name of the resource that this operation is acting on. Example:
  // `apps/myapp/services/default`.
  //
  // @OutputOnly
  string target = 5;
}
