blob: 2a1a76c6a082e643442fcd79f81bd7b9d6e01746 [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef REMOTING_BASE_COMPUTE_ENGINE_SERVICE_CLIENT_H_
#define REMOTING_BASE_COMPUTE_ENGINE_SERVICE_CLIENT_H_
#include <memory>
#include <optional>
#include <string>
#include <string_view>
#include "base/functional/callback_forward.h"
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "base/threading/thread_checker.h"
#include "base/values.h"
#include "net/http/http_status_code.h"
#include "remoting/base/http_status.h"
namespace net {
struct NetworkTrafficAnnotationTag;
} // namespace net
namespace network {
class SimpleURLLoader;
class SharedURLLoaderFactory;
} // namespace network
namespace remoting {
// A service client that communicates with the Compute Engine API. Note that the
// methods must be called from code running within a GCE VM Instance as the API
// does not exist in other contexts.
class ComputeEngineServiceClient {
public:
using ResponseCallback = base::OnceCallback<void(const HttpStatus&)>;
explicit ComputeEngineServiceClient(
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory);
ComputeEngineServiceClient(const ComputeEngineServiceClient&) = delete;
ComputeEngineServiceClient& operator=(const ComputeEngineServiceClient&) =
delete;
~ComputeEngineServiceClient();
// Must be called from code running within a Compute Engine Instance.
// Uses the default service account associated with the Instance.
// More information on this request can be found at:
// https://cloud.google.com/compute/docs/instances/verifying-instance-identity
void GetInstanceIdentityToken(std::string_view audience,
ResponseCallback callback);
// Must be called from code running within a Compute Engine Instance.
// Retrieves an OAuth access token for the default service account associated
// with the Compute Engine Instance.
void GetServiceAccountAccessToken(ResponseCallback callback);
// Must be called from code running within a Compute Engine Instance.
// Retrieves the set of OAuth scopes present in access tokens generated for
// the default service account associated with the Compute Engine Instance.
void GetServiceAccountScopes(ResponseCallback callback);
void CancelPendingRequests();
private:
void ExecuteRequest(
std::string_view url,
const net::NetworkTrafficAnnotationTag& network_annotation,
ResponseCallback callback);
void OnRequestComplete(ResponseCallback callback,
std::optional<std::string> response_body);
// |url_loader_| is non-null when a request is in-flight.
std::unique_ptr<network::SimpleURLLoader> url_loader_;
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
THREAD_CHECKER(thread_checker_);
base::WeakPtrFactory<ComputeEngineServiceClient> weak_ptr_factory_{this};
};
} // namespace remoting
#endif // REMOTING_BASE_COMPUTE_ENGINE_SERVICE_CLIENT_H_