たびとの旅路 ~電脳砂漠の冒険譚~

フロッピー頼りに歩き、クラウドの地平を見つめる今日まで。見つけたオアシス、迷い込んだ砂の迷宮、全てこの羊皮紙に。

遺跡の魂を直接読み解け ~RestSharpで、Redfishの深淵を覗く~

旅の途中、興味深いオアシスを見つけた。忘れないうちに、この羊皮紙に記しておくとしよう。

前回の旅で、我々はRedfishのモックアップという名の「地図」から、その構造を読み解く魔法を編み出した。しかし、地図はあくまで地図。真の冒険者ならば、本物の遺跡(サーバ)へ赴き、その魂に直接触れたいと思うのが常だろう。

今回は、前回の魔法をさらに進化させ、RestSharpという名の翼を授ける。これにより、我々はファイルという名の書庫から飛び立ち、ネットワークという広大な空を経て、サーバ(BMC)という名の神殿に直接アクセスするのだ。自己署名証明書という結界を突破し、@odata.idという糸を辿って、遺跡の魂の全てを一枚の羊皮紙にマージする。さあ、真の探査の旅が始まる。

この羊皮紙のあらまし

この羊皮紙が導く者

  • サーバ(BMC)から、Redfishの情報を一気に引き出したい者
  • RestSharpを使い、REST APIアクセスを実装したい探求者
  • 自己署名証明書環境での通信を実現したい開発者
  • 再帰処理によるデータ探査の実装例を学びたい技術者

砂漠の道標

  • Redfish - サーバのハードウェア情報を取得するためのREST API仕様。
  • BMC - ベースボード・マネジメント・コントローラー。サーバの監視・管理を行う専用チップ。
  • RestSharp - .NETでREST API通信を簡単に実装できるライブラリ。
  • @odata.id - Redfishにおいて、関連リソースへのリンクを示すプロパティ。
  • 自己署名証明書 - 認証局を介さず自身で発行したSSL/TLS証明書。
  • 再帰処理 - 関数が自分自身を呼び出す処理パターン。階層構造の探索に有効。
  • RemoteCertificateValidationCallback - SSL/TLS証明書の検証をカスタマイズするデリゲート。

翼を授ける儀式:RestSharpとの契約

今回の旅の鍵を握るのは、HTTPアクセスを驚くほど簡単にする魔法の道具RestSharp(REST APIクライアントライブラリ)だ。

Hello from RestSharp | RestSharp

この翼を使いこなす作法は、極めてシンプルだ。

  1. RestClient(HTTPクライアント)という翼を広げる。この時、自己署名証明書という名の結界を無視するため、RemoteCertificateValidationCallbackで「全てを信じる」と誓いを立てる。
  2. RestRequestで行き先(URI)を定め、ExecuteAsyncの呪文で大空へ飛び立つ。
  3. 戻ってきたRestResponse(HTTPレスポンス)という名の伝書バトから、お目当ての情報を受け取る。

秘儀の全貌:魂をマージする呪文

この秘儀の核心は、遺跡の魂(JSON)を読み解き、繋ぎ合わせるための、二つの設計図(クラス) と、それらを操る再帰の魔法(Readメソッド) にある。

設計図その1:JsonElement

これは、遺跡から得られる魂の欠片、一つ一つの情報を記録するための、最小単位の器だ。

/// <summary>
/// JSONの要素
/// </summary>
class JsonElement
{
    public JsonToken TokenType { get; set; }
    public object? Value { get; set; }
}

設計図その2:Redfish

そしてこれが、旅の全てを司る、我々の分身だ。翼(RestClient)を持ち、魂の欠片(JsonElement)を集め、そして再帰の魔法を唱える。

/// <summary>
/// Redfish探査と結果マージを司る
/// </summary>
class Redfish
{
    public RestClient? Client { get; set; }
    public List<JsonElement> Elements { get; set; } = new List<JsonElement>();

    HashSet<JsonToken> JsonTags { get; } = new HashSet<JsonToken>() { JsonToken.StartObject, JsonToken.EndObject, JsonToken.StartArray, JsonToken.EndArray };
    HashSet<string> OdataItems { get; set; } = new HashSet<string>() { "/redfish/v1/" };

    /// <summary>
    /// 全ての魂を再帰的に読み込む
    /// </summary>
    public void Read(string path)
    {
        if (Client == null) return;

        // RestSharpの翼で、遺跡へ直接問いかける
        var request = new RestRequest(path);
        request.AddHeader("Content-Type", "application/json");
        var response = Client.ExecuteAsync(request, Method.Get).Result;
        if (response == null || response.Content == null || response.ResponseUri == null) return;
        Console.WriteLine($"{response.ResponseUri.AbsoluteUri}\n{response.Content}\n");

        // 遺跡からの応答(JSON)を解読し、
        // 新たな「@odata.id」という名の道を見つけたら、
        // 再びこのReadメソッド自身を呼び出し、旅を続ける(再帰)
        var reader = new JsonTextReader(new StringReader(response.Content));
        while (reader.Read())
        {
            var val1 = reader.Value;
            Elements.Add(new JsonElement() { TokenType = reader.TokenType, Value = val1 });

            if (reader.TokenType != JsonToken.PropertyName) continue;
            reader.Read();
            var val2 = reader.Value;
            Elements.Add(new JsonElement() { TokenType = reader.TokenType, Value = val2 });

            if (val1 == null || val2 == null) continue;
            if (JsonTags.Contains(reader.TokenType)) continue;
            if (!((string)val1).Equals("@odata.id")) continue;

            if (!OdataItems.Contains((string)val2))
            {
                OdataItems.Add((string)val2);
                Elements.Add(new JsonElement() { TokenType = JsonToken.PropertyName, Value = "/* @odata.child */" });
                Read((string)val2);
            }
        }
    }
    // ...(Writeメソッドは、集めたElementsをファイルに書き出すだけなので省略)...
}

この再帰の魔法により、最初に/redfish/v1/という入口から入るだけで、そこから繋がる全ての道を自動的に探査し、巨大な一枚の地図(JSONファイル)として描き出すことができる。

羊皮紙を巻く前に

前回の旅でファイルから読み解いたRedfishの構造を、今回はRestSharpという翼を得て、本物の遺跡(サーバ)から直接引き出すことに成功した。自己署名証明書という結界を突破し、再帰の魔法で全ての魂を一枚の羊皮紙にマージする。いくつかの遺跡を探査する中で、100MBを超える膨大な魂に遭遇したこともあった。

RestSharpによるRedfish探査の要点

  1. RestClientで自己署名証明書を許容 - RemoteCertificateValidationCallbackによる結界突破
  2. 再帰処理による完全探査 - @odata.idを辿り、全階層を自動走査
  3. 魂のマージ - 分散した情報を一枚のJSONとして統合
  4. 実戦での注意点 - エラー処理とリトライ機構の実装が必須

今後の展望

この魔法を核として、誰もが直感的に遺跡を探査できる、GUI版の魔法の眼鏡(Redfishビューワ)を創り出してみたい。

まとめ

Redfishという広大な遺跡の、完全な地図を描き出すための基礎は、全て整った。地図から本物の遺跡へ。この旅路が、あんたの冒険の一助となれば幸いだ。

おっと、どうやら相棒が腹を空かせたようだ。今日はこのへんで筆を置くとしよう。

砂漠で見つけた魔法のランプ

ラクダの独り言

ご主人が、羊皮紙を読むだけじゃ飽き足らず、今度は「れすとしょーぷ」とかいう、鳥の翼みたいなもので、遠くの神殿から直接情報を引っこ抜いてきている。便利かもしれんが、そんなことばっかりしてると、自分の足で歩くことを忘れちまうんじゃないのかね。まったく、横着なんだから。おっと、喉が渇いてきやがった。