1. 程式人生 > >k8s1.11命令列——實現原始碼導讀之kubectl patch更新資源物件

k8s1.11命令列——實現原始碼導讀之kubectl patch更新資源物件

這一講我們來看kubectl patch更新資源物件命令,它的實現在NewCmdPatch方法中

  1. 獲取PatchOptions中儲存的命令列輸入的kubectl patch 後面跟的引數(如--all-namespace,--output,--patch等)
  2. 構建cmd patch命令,註冊patch命令的實現方法
  3. 給patch命令新增相應的引數來控制patch命令的操作
func NewCmdPatch(f cmdutil.Factory, ioStreams genericclioptions.IOStreams) *cobra.Command {
	o := NewPatchOptions(ioStreams)

	// 構建cmd patch命令
	cmd := &cobra.Command{
		Use: "patch (-f FILENAME | TYPE NAME) -p PATCH",
		DisableFlagsInUseLine: true,
		Short:   i18n.T("Update field(s) of a resource using strategic merge patch"),
		Long:    patchLong,
		Example: patchExample,
		// 程式碼實際執行部分
		Run: func(cmd *cobra.Command, args []string) {
			cmdutil.CheckErr(o.Complete(f, cmd, args))
			cmdutil.CheckErr(o.Validate())
			// patch請求的具體實現方法
			cmdutil.CheckErr(o.RunPatch())
		},
	}

	o.RecordFlags.AddFlags(cmd)
	o.PrintFlags.AddFlags(cmd)

	// 引數flag提供修飾符來控制動作命令的操作,即給命令新增引數,這些引數都儲存在PatchOptions中
	cmd.Flags().StringVarP(&o.Patch, "patch", "p", "", "The patch to be applied to the resource JSON file.")
	cmd.MarkFlagRequired("patch")
	cmd.Flags().StringVar(&o.PatchType, "type", "strategic", fmt.Sprintf("The type of patch being provided; one of %v", sets.StringKeySet(patchTypes).List()))
	cmdutil.AddDryRunFlag(cmd)
	cmdutil.AddFilenameOptionFlags(cmd, &o.FilenameOptions, "identifying the resource to update")
	cmd.Flags().BoolVar(&o.Local, "local", o.Local, "If true, patch will operate on the content of the file, not the server-side resource.")

	return cmd
}

下面來看Patch命令具體的實現函式RunPatch,RunPatch函式首先從命令列中讀取輸入的patch型別和patchBytes補丁內容,然後同get命令一樣構建Builder-Visitor資源物件訪問機制,程式碼實現如下:

     //獲取patch的型別
	patchType := types.StrategicMergePatchType
	if len(o.PatchType) != 0 {
		patchType = patchTypes[strings.ToLower(o.PatchType)]
	}
	//獲取patchBytes補丁內容
	patchBytes, err := yaml.ToJSON([]byte(o.Patch))
	if err != nil {
		return fmt.Errorf("unable to parse %q: %v", o.Patch, err)
	}
	//構建Builder,Visitor
	r := o.builder.
		Unstructured().
		ContinueOnError().
		NamespaceParam(o.namespace).DefaultNamespace().
		FilenameParam(o.enforceNamespace, &o.FilenameOptions).
		ResourceTypeOrNameArgs(false, o.args...).
		Flatten().
		Do()
	err = r.Err()
	if err != nil {
		return err
	}

通過上述步驟,我們構建了訪問要patch的資源物件的訪問器(Visitor),通過回撥函式Visit要獲取資源並執行patch請求,整個過程如下:

  1. 獲取資源物件的名字,名稱空間以及對映器mapping
  2. 由資源對映器mapping和客戶端client構建helper(Helper提供了檢索或改變RESTful資源的方法)
  3. 呼叫helper的Patch方法通過向apiServer傳送patch請求更新資源物件並返回
  4. 檢查源物件info.Object和更新後的物件patchedObj是否一致
  5. 如果記錄Recorder進行了更改,計算和建立另外一個patch(Recorder在註釋中記錄了runtime.Object更改的原因)
  6. 使用更新後的物件patchedObj更新源物件info.Object
  7. 列印輸出

程式碼實現如下:

helper.go中的Patch方法:

func (m *Helper) Patch(namespace, name string, pt types.PatchType, data []byte) (runtime.Object, error) {
	return m.RESTClient.Patch(pt).
		NamespaceIfScoped(namespace, m.NamespaceScoped).
		Resource(m.Resource).
		Name(name).
		Body(data).
		Do().
		Get()
}

相關推薦

k8s1.11命令——實現原始碼導讀kubectl patch更新資源物件

這一講我們來看kubectl patch更新資源物件命令,它的實現在NewCmdPatch方法中 獲取PatchOptions中儲存的命令列輸入的kubectl patch 後面跟的引數(如--all-namespace,--output,--patch等) 構建cmd

boostprogram_option-命令引數處理(霜小刀)

歡迎轉載和引用,若有問題請聯絡 若有疑問,請聯絡 Email : [email protected] QQ:2279557541 命令列的引數處理什麼xxx –xxx -x=xx -x 這種東西如果我們自己從argc,argv裡面提取,我相信大家

工控隨筆_07_西門子_WinCC利用命令實現操作log日誌

  在WinCC中可以通過報警紀錄來實現操作員紀錄,這個需要WinCC的訊息系統進行組態和配置。 利用訊息系統進行實現上訴功能不但複雜而且時間久啦也不方便查詢。那麼有沒有一種簡單的方法來 實現操作員紀錄呢?    我們知道在Windows系統中可以通過批處理來實現很多功能,而且操作也比較簡單,

Windows上命令實現執行時新增ODBC資料來源-odbcconf命令的使

     最近做的一個專案要求程式可以自動在windows上新增一個ODBC資料來源,發現可以用Windows API中的SQLConfigDataSource函式可以實現,在檢視MSDN文件時,這個函式等同於odbcconf.exe命令列工具。最好是使用SQ

CentOS學習筆記---CentOS命令實現普通使用者和root使用者切換

CentOS下實現普通使用者和管理員許可權的切換 使用su命令實現使用者屬性的轉換 普通使用者切換到root使用者: [tengxt@192 root]$ su root 密碼: # root 密

shell 命令實現

獲取UNIX型別的選項:   unix有一個優點就是標準UNIX命令在執行時都具有相同的命令列格式: command -options parameters   如果在執行Shell程式也採用上述格式,Bourne Shell中提供了一條獲取和處理命令列選項的語句,即getopts語句。該語句的格

版本控制svn命令下檢出、提交、更新

4 使用命令列模式訪問SVN伺服器 4.1 檢出 ①首先進入自己的工作目錄,例如:D:\DevWorkSpace\SVNSpace ②執行svn checkout命令,命令格式如下 格式 svn checkout svn://SVN伺服器主機地址/

通過命令實現Android工程資原始檔到apk的流程

前言 我們在開發Android應用的時候,可能很少研究整個Apk生成的過程,一般如AS或者Eclipse的開發工具,在執行的時候會自動幫我們將程式碼與資原始檔打包並簽名,生成相應的apk檔案,不知道大家有沒有好奇整個apk的編譯、打包過程呢,下面通過這篇

linux下ping命令實現原始碼

相信大家一定遇到過上不了網的情形,都知道用個ping命令。這不小王就是這樣的女孩,老是上不了網,老是找我,我就先ping一下,逐步找找問題在哪兒,有的放矢,不至於盲目抓瞎(說心裡話,我真不願意幫小王弄,每次弄好了,她就和那個叫寒煙的Q友,使勁聊天,唉,心裡哇涼啊.)都說實

vue的原始碼學習七——1.響應式物件

1 介紹           版本:2.5.17。         我們使用vue-vli建立基於Runtime+Compiler的vue腳手架。

mac 使用命令,對遠端伺服器進行檔案更新

目的:更新伺服器檔案A 1、遠端傳輸檔案 A.zip   在本地A檔案的父級資料夾下執行 scp ./A.zip 遠端伺服器使用者名稱@遠端伺服器IP:/要放置的資料夾目錄/   然後要輸入伺服器登陸密碼,進行檔案傳輸 2、登入遠端伺服器   ssh 遠端伺服器使用者名稱@IP地址 -p 埠號   輸入密碼

命令配置scst向windows提供iSCSI儲存資源

Ø fileio模式:預設情況下SCST的匯出模式是fileio。它允許使用檔案系統上的檔案或者塊裝置作為虛擬的SCSI裝置或光碟機,該模式可以充分利用linux的cache。預設情況下,由於效能的原因,VDISK FILEIO device使用write-back caching(寫回) 策略,對於一個穩

【3D工具】FBX轉MD5模型命令工具V3.0--(fbx2md5:更新下載)

《FBX檔案轉MD5模型格式》程式(V3.0) FBX : 是Autodesk公司出品的一款用於跨平臺的免費三維創作與交換的3D檔案格式。 MD5 : 是doom3 quake4遊戲中使用的3D骨骼動畫檔案格式,包含md5mesh和md5anim。 歡迎使用,支援拖到fbx2

樹莓派Raspberry Pi實戰命令實現USB儲存裝置自動掛載

簡單介紹實現命令列下USB儲存裝置自動掛載的方法,Linux gnome/kde視窗環境下有移動儲存的管理程式,可以實現自動掛載移動儲存裝置,但是在命令列下 通常需要用mount命令手動掛載USB儲存裝置。   通過給linux下的裝置管理服務udev新增規則配置檔案,可以實現命令列下U

ffmpeg 原始碼學習 -- 命令引數解析

ffmpeg 原始碼學習 -- 之ffmpeg命令列引數解析 大家通過git在安裝好cygwin之後,下載原始碼到(cygwin)home目錄,通過./configure  ...... ,可以新增一堆引數選項,執行可以生成config.mk等編譯使用的檔案,通過命令對工

springboot原始碼分析5-springboot命令引數以及原理

摘要:本文我們重點分析一下Springboot框架中的命令列引數的使用以及框架內部處理的命令列引數的原理。眾所周知,springboot專案可以有兩種方式啟動,第一種使用jar包;第二種使用war包。在使用jar方式的時候,我們可以在啟動jar包的時候設定一些命令引數。1.1

node命令工具實現專案工程自動初始化的標準流程

## 一、目的 傳統的前端專案初始流程一般是這樣: ![傳統流程](https://wangxiaokai.vip/images/2019-08-11-make-command-line-interface/1.png) 可以看出,傳統的初始化步驟,花費的時間並不少。而且,人工操作的情況下,**總有

Python 命令旅:使用 argparse 實現 git 命令

作者:HelloGitHub-Prodesire HelloGitHub 的《講解開源專案》系列,專案地址:https://github.com/HelloGitHub-Team/Article 前言 在前面三篇介紹 argparse 的文章中,我們全面瞭解了 argparse 的能力,相信不

Python 命令旅:使用 docopt 實現 git 命令

作者:HelloGitHub-Prodesire HelloGitHub 的《講解開源專案》系列,專案地址:https://github.com/HelloGitHub-Team/Article 一、前言 在前面兩篇介紹 docopt 的文章中,我們全面瞭解了 docopt 的能力。按照慣例,

Python 命令旅:使用 click 實現 git 命令

作者:HelloGitHub-Prodesire HelloGitHub 的《講解開源專案》系列,專案地址:https://github.com/HelloGitHub-Team/Article 一、前言 在前面五篇介紹 click 的文章中,我們全面瞭解了 click 的強大能力。按照慣例,我們