148 lines
4.0 KiB
C
148 lines
4.0 KiB
C
|
//
|
||
|
// Copyright (C) 2022 The Android Open Source Project
|
||
|
//
|
||
|
// 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.
|
||
|
|
||
|
#pragma once
|
||
|
|
||
|
#include <future>
|
||
|
#include <optional>
|
||
|
#include <string>
|
||
|
|
||
|
#include <android-base/result.h>
|
||
|
#include <json/json.h>
|
||
|
|
||
|
#include "host/libs/web/credential_source.h"
|
||
|
#include "host/libs/web/curl_wrapper.h"
|
||
|
|
||
|
namespace cuttlefish {
|
||
|
|
||
|
class GceInstanceDisk {
|
||
|
public:
|
||
|
GceInstanceDisk() = default;
|
||
|
explicit GceInstanceDisk(const Json::Value&);
|
||
|
|
||
|
static GceInstanceDisk EphemeralBootDisk();
|
||
|
|
||
|
std::optional<std::string> Name() const;
|
||
|
GceInstanceDisk& Name(const std::string&) &;
|
||
|
GceInstanceDisk Name(const std::string&) &&;
|
||
|
|
||
|
std::optional<std::string> SourceImage() const;
|
||
|
GceInstanceDisk& SourceImage(const std::string&) &;
|
||
|
GceInstanceDisk SourceImage(const std::string&) &&;
|
||
|
|
||
|
GceInstanceDisk& SizeGb(uint64_t gb) &;
|
||
|
GceInstanceDisk SizeGb(uint64_t gb) &&;
|
||
|
|
||
|
const Json::Value& AsJson() const;
|
||
|
|
||
|
private:
|
||
|
Json::Value data_;
|
||
|
};
|
||
|
|
||
|
class GceNetworkInterface {
|
||
|
public:
|
||
|
GceNetworkInterface() = default;
|
||
|
explicit GceNetworkInterface(const Json::Value&);
|
||
|
|
||
|
static GceNetworkInterface Default();
|
||
|
|
||
|
std::optional<std::string> ExternalIp() const;
|
||
|
std::optional<std::string> InternalIp() const;
|
||
|
|
||
|
const Json::Value& AsJson() const;
|
||
|
|
||
|
private:
|
||
|
Json::Value data_;
|
||
|
};
|
||
|
|
||
|
class GceInstanceInfo {
|
||
|
public:
|
||
|
GceInstanceInfo() = default;
|
||
|
explicit GceInstanceInfo(const Json::Value&);
|
||
|
|
||
|
std::optional<std::string> Zone() const;
|
||
|
GceInstanceInfo& Zone(const std::string&) &;
|
||
|
GceInstanceInfo Zone(const std::string&) &&;
|
||
|
|
||
|
std::optional<std::string> Name() const;
|
||
|
GceInstanceInfo& Name(const std::string&) &;
|
||
|
GceInstanceInfo Name(const std::string&) &&;
|
||
|
|
||
|
std::optional<std::string> MachineType() const;
|
||
|
GceInstanceInfo& MachineType(const std::string&) &;
|
||
|
GceInstanceInfo MachineType(const std::string&) &&;
|
||
|
|
||
|
GceInstanceInfo& AddDisk(const GceInstanceDisk&) &;
|
||
|
GceInstanceInfo AddDisk(const GceInstanceDisk&) &&;
|
||
|
|
||
|
GceInstanceInfo& AddNetworkInterface(const GceNetworkInterface&) &;
|
||
|
GceInstanceInfo AddNetworkInterface(const GceNetworkInterface&) &&;
|
||
|
std::vector<GceNetworkInterface> NetworkInterfaces() const;
|
||
|
|
||
|
GceInstanceInfo& AddMetadata(const std::string&, const std::string&) &;
|
||
|
GceInstanceInfo AddMetadata(const std::string&, const std::string&) &&;
|
||
|
|
||
|
GceInstanceInfo& AddScope(const std::string&) &;
|
||
|
GceInstanceInfo AddScope(const std::string&) &&;
|
||
|
|
||
|
const Json::Value& AsJson() const;
|
||
|
|
||
|
private:
|
||
|
Json::Value data_;
|
||
|
};
|
||
|
|
||
|
class GceApi {
|
||
|
public:
|
||
|
class Operation {
|
||
|
public:
|
||
|
~Operation();
|
||
|
void StopWaiting();
|
||
|
/// `true` means it waited to completion, `false` means it was cancelled
|
||
|
std::future<android::base::Result<bool>>& Future();
|
||
|
|
||
|
private:
|
||
|
class Impl;
|
||
|
std::unique_ptr<Impl> impl_;
|
||
|
Operation(std::unique_ptr<Impl>);
|
||
|
friend class GceApi;
|
||
|
};
|
||
|
|
||
|
GceApi(CurlWrapper&, CredentialSource& credentials,
|
||
|
const std::string& project);
|
||
|
|
||
|
std::future<android::base::Result<GceInstanceInfo>> Get(
|
||
|
const GceInstanceInfo&);
|
||
|
std::future<android::base::Result<GceInstanceInfo>> Get(
|
||
|
const std::string& zone, const std::string& name);
|
||
|
|
||
|
Operation Insert(const Json::Value&);
|
||
|
Operation Insert(const GceInstanceInfo&);
|
||
|
|
||
|
Operation Reset(const std::string& zone, const std::string& name);
|
||
|
Operation Reset(const GceInstanceInfo&);
|
||
|
|
||
|
Operation Delete(const std::string& zone, const std::string& name);
|
||
|
Operation Delete(const GceInstanceInfo&);
|
||
|
|
||
|
private:
|
||
|
std::vector<std::string> Headers();
|
||
|
|
||
|
CurlWrapper& curl_;
|
||
|
CredentialSource& credentials_;
|
||
|
std::string project_;
|
||
|
};
|
||
|
|
||
|
} // namespace cuttlefish
|