Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Translate Nodejs into Ruby scripts #136

Merged
merged 35 commits into from
Sep 14, 2019
Merged

Translate Nodejs into Ruby scripts #136

merged 35 commits into from
Sep 14, 2019

Conversation

AnaTofuZ
Copy link
Member

@AnaTofuZ AnaTofuZ commented Sep 10, 2019

背景

  • DojoPaaS のコードを node から Ruby に移植したい #110
  • 👆で議論されている通り、 @yasslab チームでメンテナンスをするにはやはりRubyの方が嬉しいのでRubyに翻訳していきたい
  • 最終的にはcoderdojoのrails appの中で出来るようになるとなお良い気がするので、まずは現状のフローをrubyに置き換える

方針

  • まずは現状のPRでVMが立つフローをRubyで置き換えるのを目標にする
  • その為、余計な機能をまずは書かず、jsで実装されているものをrubyで実装していく
  • この際に、以下の点を満たすのを目標にしていく
    • テストしやすくしたいので、メソッド単位に分割をしていく
    • 想定されるデータフローや、どのAPIを叩けばいいのかを明確にする
    • 極力Rubyらしいコードに変換する

すること

  • JSの機能をRubyに置き換えていく
  • まずは手元で実行し、VMが生成されるかを確認する
    • ディスクが作成できるか
    • ...が作成できるか
  • travis ci上で生成する事が可能であるか
  • (advance) gemとして切り出せそうな単位に書き換えられたか

@AnaTofuZ AnaTofuZ self-assigned this Sep 10, 2019
@yasulab
Copy link
Member

yasulab commented Sep 10, 2019

👀✨

@yasulab yasulab changed the title [WIP]Translate ruby scripts [WIP] Translate Ruby scripts Sep 10, 2019
@yasulab yasulab changed the title [WIP] Translate Ruby scripts [WIP] Translate Nodejs into Ruby scripts Sep 10, 2019
@AnaTofuZ
Copy link
Member Author

異常に...っていうわけでもないけどインスタンス作るときの引数がなかなか大きくなってしまったので、後々機能を分割するリファクタをしたい気がする

def initialize(zone:0, plan:nil, packetfilterid:nil, name:nil, description:nil,
tags:nil, pubkey:nil, disk:{}, resolve:nil, notes:nil)
@zone = zone
@plan = plan
@packetfilterid = packetfilterid
@name = name
@description = description
@tags = tags
@pubkey = pubkey
@disk = disk
@resolve = resolve
@notes = notes
@client = JSONClient.new
@client.set_proxy_auth(SAKURA_TOKEN, SAKURA_TOKEN_SECRET)
end

@AnaTofuZ
Copy link
Member Author

とりあえずは機能が提供できるかどうかがポイントなので、一旦は汚くても機能が提供できるのを目標にしたい......!!!!

@yasulab
Copy link
Member

yasulab commented Sep 10, 2019

一旦は汚くても機能が提供できるのを目標にしたい......!!!!

d( ̄  ̄)💖✨

@AnaTofuZ
Copy link
Member Author

そもそも何のjsスクリプトがデプロイ時に動いていたか危なかったけど、見た感じ

"deploy": "node dojopaas.js",

っぽい気がする

@AnaTofuZ
Copy link
Member Author

dojopaas/dojopaas.js

Lines 1 to 4 in d5580c9

var sacloud = require('sacloud');
var fs = require('fs');
var csv = require('comma-separated-values');
var Server = require('./lib/Server');

👆このあたりはすでに書いた(気がする)ので、次はこのデプロイスクリプトをシュッと書くことになりそう

@AnaTofuZ
Copy link
Member Author

dojopaas/dojopaas.js

Lines 13 to 39 in d5580c9

if (true === production) {
var config = {
defaultTag: 'dojopaas',
zone: "31002", // 石狩第二
api: "https://secure.sakura.ad.jp/cloud/zone/is1b/api/cloud/1.1/", // 石狩第二
plan: "1001", // 1コア、1GBメモリ
packetfilterid: '112900922505', // See https://secure.sakura.ad.jp/cloud/iaas/#!/network/packetfilter/.
disk: {
Plan: { ID: 4 }, // SSD
SizeMB: 20480 // 20GB
},
notes: [{ID: "112900928939"}] // See https://secure.sakura.ad.jp/cloud/iaas/#!/pref/script/.
}
} else {
var config = {
defaultTag: 'dojopaas',
zone: "29001", // サンドボックス
api: "https://secure.sakura.ad.jp/cloud/zone/tk1v/api/cloud/1.1/",
plan: 1001, // 1コア、1GBメモリ
packetfilterid: '112900927419', // See https://secure.sakura.ad.jp/cloud/iaas/#!/network/packetfilter/.
disk: {
Plan: { ID: 4 }, // SSD
SizeMB: 20480 // 20GB
},
notes: [{ID: "112900928939"}] // See https://secure.sakura.ad.jp/cloud/iaas/#!/pref/script/.
}
}

👆で頑張ってsandboxに建てるか石狩に建てるかを判断していそう。なんとなく全部石狩に建てていそうな気がする

@AnaTofuZ
Copy link
Member Author

grepしたらREADMEにしか --production 抜きの実行(sandboxに建てる)しか書かれてない

+mumei+anatofuz$ rg 'npm run deploy'
README.md
124:$ npm run deploy # サンドボックスにインスタンスを作成
125:$ npm run deploy -- --production # 本番環境でインスタンスを作成

bin/deploy.sh
15:npm run deploy -- --production

@AnaTofuZ
Copy link
Member Author

一旦何も考えずに1枚のrbファイルにしてしまうか

@AnaTofuZ
Copy link
Member Author

AnaTofuZ commented Sep 11, 2019

あまりにも数が増えそうなので別のファイルに訳ようかなと考えてみた

Ruby外部ファイルにするときに moduleにしたほうが良いのか純粋にclassで良いのか問題でちょっと悩む。
他のライブラリを何個か見ると、トップレベルの.rbはひたすらrequireしていて、下のディレクトリのrbはmoduleで囲った後にclassで分けているのがいい感じらしい。

とはいえ今回は今の所deployスクリプトしか使わないので、まずはclassに分けて純粋にrequireしてあげる実装でやってみる

@AnaTofuZ
Copy link
Member Author

APIをいい感じに叩いてくれるライブラリはできたので、そのライブラリのメソッドをいい感じに実行する
deploy.rb を生成して、これを実装している...!!

@AnaTofuZ
Copy link
Member Author

次は

dojopaas/dojopaas.js

Lines 70 to 106 in 612b78a

client.createRequest({
method: 'GET',
path : 'archive'
}).send(function(err, result) {
if (err) throw new Error(err);
var archives = result.response.archives;
var archiveid = 0;
for ( var i = 0; i < archives.length; i++ ) {
if ( archives[i].name.match(/ubuntu/i) && archives[i].name.match(/16\.04/i) ) {
archiveid = archives[i].id;
}
}
if (archiveid) {
console.log( 'Archive ID:' + archiveid );
config.disk.SourceArchive = { ID: archiveid };
} else {
if (err) throw new Error("Can't get archive id.");
}
console.log('Get a list of existing servers.')
client.createRequest({
method: 'GET',
path : 'server',
body : {
Filter: {
"Tags": config.defaultTag
}
}
}).send(function(err, result) {
if (err) throw new Error(err);
var servers = [];
for (var i=0; i<result.response.servers.length; i++) {
servers.push(result.response.servers[i].name)
}

👆があたりで何をしているかを読んで実装する

@AnaTofuZ
Copy link
Member Author

まずはserverの一覧を持ってきていたので

def get_servers()
body = { Filter: {Tags: @tags.first} }
send_request('get','server',body)
end

👆のようなメソッドを生やして叩いたところ、401errorだった....(´・ω・`)
curlなどで動くかどうかを確かめて、Rubyでなぜ動かないかを検証する

@AnaTofuZ
Copy link
Member Author

ドキュメントみたら
https://www.rubydoc.info/gems/httpclient/HTTPClient#label-Configuring+authentication+credentials
set_proxy_auth じゃなくて set_auth っぽさがあり、実際変えたら動いた 👍

deploy.rbからさくらのAPIをまとめたsakura_server_user_agent.rbを叩く実装に変更した
@AnaTofuZ
Copy link
Member Author

sandbox環境にVMが立つところまで確認できました。
sandbox環境ではVMを起動してaccessすることができないので、OSが正常に入ってるかどうかが怪しいところです。。。 > @yasulab

一旦travis ciをnodeからrubyに差し替えて、どう動くかが見たいかなと思います

@yasulab
Copy link
Member

yasulab commented Sep 13, 2019

@AnaTofuZ どうぞどうぞ!あとで試しに立てたサーバーを削除してもらえれば全然大丈夫です!!😆👌✨

@AnaTofuZ
Copy link
Member Author

ありがとうございます🙏
サーバー上書きは多分無いですが、生データを触るのは心配なのでCoderDojo anagura立てて(?)テストしてみます

@AnaTofuZ
Copy link
Member Author

ひたすら現在の状況を見てsleepとshutdownをもう一度API callする実装にしたら再起動まで行えた。
何故かsshできない....

@AnaTofuZ AnaTofuZ changed the title [WIP] Translate Nodejs into Ruby scripts Translate Nodejs into Ruby scripts Sep 14, 2019
@AnaTofuZ AnaTofuZ marked this pull request as ready for review September 14, 2019 00:49
@AnaTofuZ
Copy link
Member Author

@yasulab レビューお願いします!

@AnaTofuZ
Copy link
Member Author

rakeが走ってないてる...

@yasulab
Copy link
Member

yasulab commented Sep 14, 2019

@AnaTofuZ 了解です! #137 のサーバー提供が終わるのを確認したらマージしますね 😉

Rakefile Outdated Show resolved Hide resolved
@AnaTofuZ
Copy link
Member Author

@yasulab ありがとうございます!!

@yasulab
Copy link
Member

yasulab commented Sep 14, 2019

@AnaTofuZ マージしますね 😉 マージされたら PR 出して本番環境でも確認してもらえると嬉しいです...!! (>人< )✨

@yasulab yasulab merged commit b5005e2 into master Sep 14, 2019
@yasulab yasulab deleted the translate_ruby_scripts branch September 14, 2019 01:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants