0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Finch を簡単なコードでまとめてみた(自作)

Last updated at Posted at 2022-11-28

Finch を自作してみた

最近 AWS が OSS と公開した Finch ですが、その Finch のソースコードを追ってみたら、nerdctllimactl をコマンドで叩いているだけの簡単な CLIアプリ に見えました。
なので、そのコードを Javascript で再現してみました。

Finch の大まかな内容は、

Finch のソースコードの説明は、

にあります。

使い方

まずは、

の内容を、

source requirement.bash

でインストールします(現状は lima だけですが、今後も増えるかもしれないので...)。

Finch は CLI ということで、自作では node で 動く CLI アプリのようなものにしました。
利用方法は、finch vm init が、

npm start vm init

finch vm stop

npm start vm stop

finch run --rm public.ecr.aws/finch/hello-finch のような docker ライクな nerdctl コマンドが

npm start run --rm public.ecr.aws/finch/hello-finch

のように、docker の代わりに npm start を入れれば入力できるようになっています。

実装

コードは

にあります。

ソースコード
/**
 * Usage
 * 
 * npm start vm [start/stop/remove/init]
 * npm start [build/run/commit/ps/image/run...] 
 * 
 */

const { exec } = require("child_process")

const [, , ...AllArgs] = process.argv
const nerdctlCommands = [
  'build',   'builder',   'commit',
  'compose', 'container', 'create',
  'events',  'exec',      'history',
  'image',   'images',    'info',
  'inspect', 'kill',      'load',
  'login',   'logout',    'logs',
  'network', 'pause',     'port',
  'ps',      'pull',      'push',
  'restart', 'rm',        'rmi',
  'run',     'save',      'start',
  'stats',   'stop',      'system',
  'tag',     'top',       'unpause',
  'update',  'volume',    'wait'
]
const limactlCommands = ["start", "stop", "remove", "init"]

if (AllArgs.length === 0) {
	console.error("Please pass argument.")
	process.exit(1)
}

const firstArg = AllArgs[0]

if (firstArg !== "vm" && nerdctlCommands.indexOf(firstArg) === -1 ) {
	console.log("Please pass correct argument.")
	process.exit(1)
}

if (AllArgs[0] === "vm") {
	const secondArg = AllArgs[1]
	if (secondArg === undefined) {
		console.log("Please pass correct argment")
		return
	}
	let limaCommand = ""
	switch (secondArg) {
		case 'start':
			console.log("vm starting...")
			console.log("結果が出てくるのに、数分かかります。")
			limaCommand = joinLimactlArray([secondArg, "mini-finch"])
			break;
		case 'stop':
			console.log("vm stopping...")
			limaCommand = joinLimactlArray([secondArg, "mini-finch"])
			break;
		case 'remove':
			console.log("vm removing...")
			limaCommand = joinLimactlArray([secondArg, "mini-finch"])
			break;
		case 'init':
			console.log("vm initing...")
			console.log("結果が出てくるのに、数分かかります。")
			limaCommand = joinLimactlArray(["start", "--name=mini-finch", "./finch.yaml", "--tty=false"])
			break;
		default:
			console.log("Please pass correct argment")
			return;
	}
	console.log(limaCommand)
	execCommand(limaCommand)
} else {
	const limaCommand = joinNerdctlArray(AllArgs)
	console.log(limaCommand)
	execCommand(limaCommand)
}

function joinNerdctlArray(array) {
	const limactlArray = ["limactl", "shell", "mini-finch", "nerdctl"]
	const limaCommand = limactlArray.concat(array)
	return limaCommand.join(" ")
}

function joinLimactlArray(array) {
	const limactlArray = ["limactl"]
	const limaCommand = limactlArray.concat(array)
	return limaCommand.join(" ")
}

function execCommand(command) {
	exec(command, (err, stdout, stderr) => {
		if (err) { 
			console.log(`error: ${stderr}`)
			return
		}
		console.log(`output: ${stdout}`)
	})
}

簡単に書いただけなので、間違っている部分などあったら指摘いただければと思います。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?