agones.dev/agones@v1.53.0/test/sdk/cpp/server.cc (about)

     1  // Copyright 2020 Google LLC All Rights Reserved.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  // A server that starts, and then stops after 60 seconds.
    16  // This example really does nothing other than show how to integrate
    17  // the C++ SDK.
    18  
    19  #include <agones/sdk.h>
    20  #include <grpc++/grpc++.h>
    21  #include <iostream>
    22  #include <thread>
    23  
    24  // send health check pings
    25  void DoHealth(std::shared_ptr<agones::SDK> sdk) {
    26    bool ok = sdk->Health();
    27    std::cout << "Health ping " << (ok ? "sent" : "failed") << "\n" << std::flush;
    28  }
    29  
    30  // watch GameServer Updates
    31  void WatchUpdates(std::shared_ptr<agones::SDK> sdk) {
    32    std::cout << "Starting to watch GameServer updates...\n" << std::flush;
    33    sdk->WatchGameServer([](const agones::dev::sdk::GameServer& gameserver) {
    34      std::cout << "GameServer Update:\n"                                 //
    35                << "\tname: " << gameserver.object_meta().name() << "\n"  //
    36                << "\tstate: " << gameserver.status().state() << "\n"
    37                << std::flush;
    38    });
    39  }
    40  
    41  int main() {
    42    std::cout << "C++ Game Server has started!\n"
    43              << "Getting the instance of the SDK.\n" << std::flush;
    44    auto sdk = std::make_shared<agones::SDK>();
    45  
    46    std::cout << "Attempting to connect...\n" << std::flush;
    47    if (!sdk->Connect()) {
    48      std::cerr << "Exiting!\n";
    49      return -1;
    50    }
    51    std::cout << "...handshake complete.\n" << std::flush;
    52  
    53    DoHealth(sdk);
    54    std::thread watch(WatchUpdates, sdk);
    55  
    56    std::cout << "Marking server as ready...\n" << std::flush;
    57    grpc::Status status = sdk->Ready();
    58    if (!status.ok()) {
    59      std::cerr << "Could not run Ready(): " << status.error_message()
    60                << ". Exiting!\n";
    61      return -1;
    62    }
    63    std::cout << "...marked Ready\n" << std::flush;
    64  
    65    status = sdk->Allocate();
    66    if (!status.ok()) {
    67      std::cerr << "Could not run Allocate(): " << status.error_message()
    68                << ". Exiting!\n";
    69      return -1;
    70    }
    71    std::cout << "...marked Allocated\n" << std::flush;
    72  
    73    std::chrono::seconds sec(1);
    74    status = sdk->Reserve(sec);
    75    if (!status.ok()) {
    76      std::cerr << "Could not run Reserve(): " << status.error_message()
    77                << ". Exiting!\n";
    78      return -1;
    79    }
    80    std::cout << "...marked Reserved\n" << std::flush;
    81  
    82    std::cout << "Getting GameServer details...\n" << std::flush;
    83    agones::dev::sdk::GameServer gameserver;
    84    status = sdk->GameServer(&gameserver);
    85  
    86    if (!status.ok()) {
    87      std::cerr << "Could not run GameServer(): " << status.error_message()
    88                << ". Exiting!\n";
    89      return -1;
    90    }
    91  
    92    std::cout << "GameServer name: " << gameserver.object_meta().name() << "\n"
    93              << std::flush;
    94  
    95    std::cout << "Setting a label\n" << std::flush;
    96    status = sdk->SetLabel(
    97        "test-label",
    98        std::to_string(gameserver.object_meta().creation_timestamp()));
    99    if (!status.ok()) {
   100      std::cerr << "Could not run SetLabel(): " << status.error_message()
   101                << ". Exiting!\n";
   102      return -1;
   103    }
   104  
   105    std::cout << "Setting an annotation\n" << std::flush;
   106    status =
   107        sdk->SetAnnotation("test-annotation", gameserver.object_meta().uid());
   108    if (!status.ok()) {
   109      std::cerr << "Could not run SetAnnotation(): " << status.error_message()
   110                << ". Exiting!\n";
   111      return -1;
   112    }
   113  
   114    for (int i = 0; i < 2; i++) {
   115      int time = i * 10;
   116      std::cout << "Running for " + std::to_string(time) + " seconds !\n"
   117                << std::flush;
   118  
   119      std::this_thread::sleep_for(std::chrono::seconds(10));
   120  
   121      if (i == 1) {
   122        std::cout << "Shutting down after 10 seconds...\n" << std::flush;
   123        grpc::Status status = sdk->Shutdown();
   124        if (!status.ok()) {
   125          std::cerr << "Could not run Shutdown():" << status.error_message()
   126                    << ". Exiting!\n";
   127          return -1;
   128        }
   129        std::cout << "...marked for Shutdown\n" << std::flush;
   130      }
   131    }
   132    watch.join();
   133  
   134    return 0;
   135  }