From 4536cfe1a0974a88107cbabc1806b6c8105388da Mon Sep 17 00:00:00 2001 From: doleebest Date: Thu, 2 Jan 2025 14:05:04 +0900 Subject: [PATCH 1/3] feat : api version --- Makefile | 4 +- api/models/version_get_entry.go | 53 +++++ api/restapi/configure_loxilb_rest_api.go | 3 + api/restapi/embedded_spec.go | 90 ++++++++ api/restapi/handler/version.go | 32 +++ api/restapi/operations/get_version.go | 58 ++++++ .../operations/get_version_parameters.go | 46 +++++ .../operations/get_version_responses.go | 194 ++++++++++++++++++ .../operations/get_version_urlbuilder.go | 87 ++++++++ api/restapi/operations/loxilb_rest_api_api.go | 12 ++ api/restapi/server.go | 2 +- api/swagger.yml | 36 +++- common/common.go | 6 + main.go | 7 +- 14 files changed, 623 insertions(+), 7 deletions(-) create mode 100644 api/models/version_get_entry.go create mode 100644 api/restapi/handler/version.go create mode 100644 api/restapi/operations/get_version.go create mode 100644 api/restapi/operations/get_version_parameters.go create mode 100644 api/restapi/operations/get_version_responses.go create mode 100644 api/restapi/operations/get_version_urlbuilder.go diff --git a/Makefile b/Makefile index f85a7815..49373024 100644 --- a/Makefile +++ b/Makefile @@ -11,8 +11,8 @@ subsys-clean: cd loxilb-ebpf && $(MAKE) clean build: subsys - @go build -o ${bin} -ldflags="-X 'main.buildInfo=${shell date '+%Y_%m_%d_%Hh:%Mm'}-${shell git branch --show-current}'" - + @go build -o ${bin} -ldflags="-X 'github.com/loxilb-io/loxilb/common.BuildInfo=${shell date '+%Y_%m_%d_%Hh:%Mm'}-${shell git branch --show-current}'" + clean: subsys-clean go clean diff --git a/api/models/version_get_entry.go b/api/models/version_get_entry.go new file mode 100644 index 00000000..69f1df80 --- /dev/null +++ b/api/models/version_get_entry.go @@ -0,0 +1,53 @@ +// Code generated by go-swagger; DO NOT EDIT. + +package models + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + + "github.com/go-openapi/strfmt" + "github.com/go-openapi/swag" +) + +// VersionGetEntry version get entry +// +// swagger:model VersionGetEntry +type VersionGetEntry struct { + + // build info + BuildInfo string `json:"buildInfo,omitempty"` + + // Instance name + Version string `json:"version,omitempty"` +} + +// Validate validates this version get entry +func (m *VersionGetEntry) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this version get entry based on context it is used +func (m *VersionGetEntry) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (m *VersionGetEntry) MarshalBinary() ([]byte, error) { + if m == nil { + return nil, nil + } + return swag.WriteJSON(m) +} + +// UnmarshalBinary interface implementation +func (m *VersionGetEntry) UnmarshalBinary(b []byte) error { + var res VersionGetEntry + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *m = res + return nil +} diff --git a/api/restapi/configure_loxilb_rest_api.go b/api/restapi/configure_loxilb_rest_api.go index 1db9e93e..20e8ac84 100644 --- a/api/restapi/configure_loxilb_rest_api.go +++ b/api/restapi/configure_loxilb_rest_api.go @@ -182,6 +182,9 @@ func configureAPI(api *operations.LoxilbRestAPIAPI) http.Handler { api.PostConfigBgpPolicyApplyHandler = operations.PostConfigBgpPolicyApplyHandlerFunc(handler.ConfigPostBGPPolicyApply) api.DeleteConfigBgpPolicyApplyHandler = operations.DeleteConfigBgpPolicyApplyHandlerFunc(handler.ConfigDeleteBGPPolicyApply) + // Version + api.GetVersionHandler = operations.GetVersionHandlerFunc(handler.ConfigGetVersion) + api.PreServerShutdown = func() {} api.ServerShutdown = func() {} diff --git a/api/restapi/embedded_spec.go b/api/restapi/embedded_spec.go index 97ad8c5a..c81f414f 100644 --- a/api/restapi/embedded_spec.go +++ b/api/restapi/embedded_spec.go @@ -4236,6 +4236,38 @@ func init() { } } } + }, + "/version": { + "get": { + "description": "Get version inforrmation", + "summary": "Get version inforrmation in the device", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/VersionGetEntry" + } + }, + "401": { + "description": "Invalid authentication credentials", + "schema": { + "$ref": "#/definitions/Error" + } + }, + "500": { + "description": "Internal service error", + "schema": { + "$ref": "#/definitions/Error" + } + }, + "503": { + "description": "Maintanence mode", + "schema": { + "$ref": "#/definitions/Error" + } + } + } + } } }, "definitions": { @@ -5770,6 +5802,19 @@ func init() { } } }, + "VersionGetEntry": { + "type": "object", + "properties": { + "buildInfo": { + "description": "build info", + "type": "string" + }, + "version": { + "description": "Instance name", + "type": "string" + } + } + }, "VlanBridgeEntry": { "type": "object", "properties": { @@ -10088,6 +10133,38 @@ func init() { } } } + }, + "/version": { + "get": { + "description": "Get version inforrmation", + "summary": "Get version inforrmation in the device", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/VersionGetEntry" + } + }, + "401": { + "description": "Invalid authentication credentials", + "schema": { + "$ref": "#/definitions/Error" + } + }, + "500": { + "description": "Internal service error", + "schema": { + "$ref": "#/definitions/Error" + } + }, + "503": { + "description": "Maintanence mode", + "schema": { + "$ref": "#/definitions/Error" + } + } + } + } } }, "definitions": { @@ -12507,6 +12584,19 @@ func init() { } } }, + "VersionGetEntry": { + "type": "object", + "properties": { + "buildInfo": { + "description": "build info", + "type": "string" + }, + "version": { + "description": "Instance name", + "type": "string" + } + } + }, "VlanBridgeEntry": { "type": "object", "properties": { diff --git a/api/restapi/handler/version.go b/api/restapi/handler/version.go new file mode 100644 index 00000000..8d09bb4e --- /dev/null +++ b/api/restapi/handler/version.go @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2022 NetLOX Inc + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package handler + +import ( + "github.com/go-openapi/runtime/middleware" + "github.com/loxilb-io/loxilb/api/models" + "github.com/loxilb-io/loxilb/api/restapi/operations" + cmn "github.com/loxilb-io/loxilb/common" + tk "github.com/loxilb-io/loxilib" +) + +func ConfigGetVersion(params operations.GetVersionParams) middleware.Responder { + tk.LogIt(tk.LogDebug, "[API] version %s API called. url : %s\n", params.HTTPRequest.Method, params.HTTPRequest.URL) + var result models.VersionGetEntry + result.Version = cmn.Version + result.BuildInfo = cmn.BuildInfo + return operations.NewGetVersionOK().WithPayload(&result) +} diff --git a/api/restapi/operations/get_version.go b/api/restapi/operations/get_version.go new file mode 100644 index 00000000..d88d6762 --- /dev/null +++ b/api/restapi/operations/get_version.go @@ -0,0 +1,58 @@ +// Code generated by go-swagger; DO NOT EDIT. + +package operations + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the generate command + +import ( + "net/http" + + "github.com/go-openapi/runtime/middleware" +) + +// GetVersionHandlerFunc turns a function with the right signature into a get version handler +type GetVersionHandlerFunc func(GetVersionParams) middleware.Responder + +// Handle executing the request and returning a response +func (fn GetVersionHandlerFunc) Handle(params GetVersionParams) middleware.Responder { + return fn(params) +} + +// GetVersionHandler interface for that can handle valid get version params +type GetVersionHandler interface { + Handle(GetVersionParams) middleware.Responder +} + +// NewGetVersion creates a new http.Handler for the get version operation +func NewGetVersion(ctx *middleware.Context, handler GetVersionHandler) *GetVersion { + return &GetVersion{Context: ctx, Handler: handler} +} + +/* + GetVersion swagger:route GET /version getVersion + +# Get version inforrmation in the device + +Get version inforrmation +*/ +type GetVersion struct { + Context *middleware.Context + Handler GetVersionHandler +} + +func (o *GetVersion) ServeHTTP(rw http.ResponseWriter, r *http.Request) { + route, rCtx, _ := o.Context.RouteInfo(r) + if rCtx != nil { + *r = *rCtx + } + var Params = NewGetVersionParams() + if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params + o.Context.Respond(rw, r, route.Produces, route, err) + return + } + + res := o.Handler.Handle(Params) // actually handle the request + o.Context.Respond(rw, r, route.Produces, route, res) + +} diff --git a/api/restapi/operations/get_version_parameters.go b/api/restapi/operations/get_version_parameters.go new file mode 100644 index 00000000..b261cda2 --- /dev/null +++ b/api/restapi/operations/get_version_parameters.go @@ -0,0 +1,46 @@ +// Code generated by go-swagger; DO NOT EDIT. + +package operations + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "net/http" + + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime/middleware" +) + +// NewGetVersionParams creates a new GetVersionParams object +// +// There are no default values defined in the spec. +func NewGetVersionParams() GetVersionParams { + + return GetVersionParams{} +} + +// GetVersionParams contains all the bound params for the get version operation +// typically these are obtained from a http.Request +// +// swagger:parameters GetVersion +type GetVersionParams struct { + + // HTTP Request Object + HTTPRequest *http.Request `json:"-"` +} + +// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface +// for simple values it will use straight method calls. +// +// To ensure default values, the struct must have been initialized with NewGetVersionParams() beforehand. +func (o *GetVersionParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { + var res []error + + o.HTTPRequest = r + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} diff --git a/api/restapi/operations/get_version_responses.go b/api/restapi/operations/get_version_responses.go new file mode 100644 index 00000000..d141583a --- /dev/null +++ b/api/restapi/operations/get_version_responses.go @@ -0,0 +1,194 @@ +// Code generated by go-swagger; DO NOT EDIT. + +package operations + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "net/http" + + "github.com/go-openapi/runtime" + + "github.com/loxilb-io/loxilb/api/models" +) + +// GetVersionOKCode is the HTTP code returned for type GetVersionOK +const GetVersionOKCode int = 200 + +/* +GetVersionOK OK + +swagger:response getVersionOK +*/ +type GetVersionOK struct { + + /* + In: Body + */ + Payload *models.VersionGetEntry `json:"body,omitempty"` +} + +// NewGetVersionOK creates GetVersionOK with default headers values +func NewGetVersionOK() *GetVersionOK { + + return &GetVersionOK{} +} + +// WithPayload adds the payload to the get version o k response +func (o *GetVersionOK) WithPayload(payload *models.VersionGetEntry) *GetVersionOK { + o.Payload = payload + return o +} + +// SetPayload sets the payload to the get version o k response +func (o *GetVersionOK) SetPayload(payload *models.VersionGetEntry) { + o.Payload = payload +} + +// WriteResponse to the client +func (o *GetVersionOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { + + rw.WriteHeader(200) + if o.Payload != nil { + payload := o.Payload + if err := producer.Produce(rw, payload); err != nil { + panic(err) // let the recovery middleware deal with this + } + } +} + +// GetVersionUnauthorizedCode is the HTTP code returned for type GetVersionUnauthorized +const GetVersionUnauthorizedCode int = 401 + +/* +GetVersionUnauthorized Invalid authentication credentials + +swagger:response getVersionUnauthorized +*/ +type GetVersionUnauthorized struct { + + /* + In: Body + */ + Payload *models.Error `json:"body,omitempty"` +} + +// NewGetVersionUnauthorized creates GetVersionUnauthorized with default headers values +func NewGetVersionUnauthorized() *GetVersionUnauthorized { + + return &GetVersionUnauthorized{} +} + +// WithPayload adds the payload to the get version unauthorized response +func (o *GetVersionUnauthorized) WithPayload(payload *models.Error) *GetVersionUnauthorized { + o.Payload = payload + return o +} + +// SetPayload sets the payload to the get version unauthorized response +func (o *GetVersionUnauthorized) SetPayload(payload *models.Error) { + o.Payload = payload +} + +// WriteResponse to the client +func (o *GetVersionUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { + + rw.WriteHeader(401) + if o.Payload != nil { + payload := o.Payload + if err := producer.Produce(rw, payload); err != nil { + panic(err) // let the recovery middleware deal with this + } + } +} + +// GetVersionInternalServerErrorCode is the HTTP code returned for type GetVersionInternalServerError +const GetVersionInternalServerErrorCode int = 500 + +/* +GetVersionInternalServerError Internal service error + +swagger:response getVersionInternalServerError +*/ +type GetVersionInternalServerError struct { + + /* + In: Body + */ + Payload *models.Error `json:"body,omitempty"` +} + +// NewGetVersionInternalServerError creates GetVersionInternalServerError with default headers values +func NewGetVersionInternalServerError() *GetVersionInternalServerError { + + return &GetVersionInternalServerError{} +} + +// WithPayload adds the payload to the get version internal server error response +func (o *GetVersionInternalServerError) WithPayload(payload *models.Error) *GetVersionInternalServerError { + o.Payload = payload + return o +} + +// SetPayload sets the payload to the get version internal server error response +func (o *GetVersionInternalServerError) SetPayload(payload *models.Error) { + o.Payload = payload +} + +// WriteResponse to the client +func (o *GetVersionInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { + + rw.WriteHeader(500) + if o.Payload != nil { + payload := o.Payload + if err := producer.Produce(rw, payload); err != nil { + panic(err) // let the recovery middleware deal with this + } + } +} + +// GetVersionServiceUnavailableCode is the HTTP code returned for type GetVersionServiceUnavailable +const GetVersionServiceUnavailableCode int = 503 + +/* +GetVersionServiceUnavailable Maintanence mode + +swagger:response getVersionServiceUnavailable +*/ +type GetVersionServiceUnavailable struct { + + /* + In: Body + */ + Payload *models.Error `json:"body,omitempty"` +} + +// NewGetVersionServiceUnavailable creates GetVersionServiceUnavailable with default headers values +func NewGetVersionServiceUnavailable() *GetVersionServiceUnavailable { + + return &GetVersionServiceUnavailable{} +} + +// WithPayload adds the payload to the get version service unavailable response +func (o *GetVersionServiceUnavailable) WithPayload(payload *models.Error) *GetVersionServiceUnavailable { + o.Payload = payload + return o +} + +// SetPayload sets the payload to the get version service unavailable response +func (o *GetVersionServiceUnavailable) SetPayload(payload *models.Error) { + o.Payload = payload +} + +// WriteResponse to the client +func (o *GetVersionServiceUnavailable) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { + + rw.WriteHeader(503) + if o.Payload != nil { + payload := o.Payload + if err := producer.Produce(rw, payload); err != nil { + panic(err) // let the recovery middleware deal with this + } + } +} diff --git a/api/restapi/operations/get_version_urlbuilder.go b/api/restapi/operations/get_version_urlbuilder.go new file mode 100644 index 00000000..ca4c6d5f --- /dev/null +++ b/api/restapi/operations/get_version_urlbuilder.go @@ -0,0 +1,87 @@ +// Code generated by go-swagger; DO NOT EDIT. + +package operations + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the generate command + +import ( + "errors" + "net/url" + golangswaggerpaths "path" +) + +// GetVersionURL generates an URL for the get version operation +type GetVersionURL struct { + _basePath string +} + +// WithBasePath sets the base path for this url builder, only required when it's different from the +// base path specified in the swagger spec. +// When the value of the base path is an empty string +func (o *GetVersionURL) WithBasePath(bp string) *GetVersionURL { + o.SetBasePath(bp) + return o +} + +// SetBasePath sets the base path for this url builder, only required when it's different from the +// base path specified in the swagger spec. +// When the value of the base path is an empty string +func (o *GetVersionURL) SetBasePath(bp string) { + o._basePath = bp +} + +// Build a url path and query string +func (o *GetVersionURL) Build() (*url.URL, error) { + var _result url.URL + + var _path = "/version" + + _basePath := o._basePath + if _basePath == "" { + _basePath = "/netlox/v1" + } + _result.Path = golangswaggerpaths.Join(_basePath, _path) + + return &_result, nil +} + +// Must is a helper function to panic when the url builder returns an error +func (o *GetVersionURL) Must(u *url.URL, err error) *url.URL { + if err != nil { + panic(err) + } + if u == nil { + panic("url can't be nil") + } + return u +} + +// String returns the string representation of the path with query string +func (o *GetVersionURL) String() string { + return o.Must(o.Build()).String() +} + +// BuildFull builds a full url with scheme, host, path and query string +func (o *GetVersionURL) BuildFull(scheme, host string) (*url.URL, error) { + if scheme == "" { + return nil, errors.New("scheme is required for a full url on GetVersionURL") + } + if host == "" { + return nil, errors.New("host is required for a full url on GetVersionURL") + } + + base, err := o.Build() + if err != nil { + return nil, err + } + + base.Scheme = scheme + base.Host = host + return base, nil +} + +// StringFull returns the string representation of a complete url +func (o *GetVersionURL) StringFull(scheme, host string) string { + return o.Must(o.BuildFull(scheme, host)).String() +} diff --git a/api/restapi/operations/loxilb_rest_api_api.go b/api/restapi/operations/loxilb_rest_api_api.go index 4eccb25a..f65a6b38 100644 --- a/api/restapi/operations/loxilb_rest_api_api.go +++ b/api/restapi/operations/loxilb_rest_api_api.go @@ -192,6 +192,9 @@ func NewLoxilbRestAPIAPI(spec *loads.Document) *LoxilbRestAPIAPI { GetStatusProcessHandler: GetStatusProcessHandlerFunc(func(params GetStatusProcessParams) middleware.Responder { return middleware.NotImplemented("operation GetStatusProcess has not yet been implemented") }), + GetVersionHandler: GetVersionHandlerFunc(func(params GetVersionParams) middleware.Responder { + return middleware.NotImplemented("operation GetVersion has not yet been implemented") + }), PostConfigBfdHandler: PostConfigBfdHandlerFunc(func(params PostConfigBfdParams) middleware.Responder { return middleware.NotImplemented("operation PostConfigBfd has not yet been implemented") }), @@ -400,6 +403,8 @@ type LoxilbRestAPIAPI struct { GetStatusFilesystemHandler GetStatusFilesystemHandler // GetStatusProcessHandler sets the operation handler for the get status process operation GetStatusProcessHandler GetStatusProcessHandler + // GetVersionHandler sets the operation handler for the get version operation + GetVersionHandler GetVersionHandler // PostConfigBfdHandler sets the operation handler for the post config bfd operation PostConfigBfdHandler PostConfigBfdHandler // PostConfigBgpGlobalHandler sets the operation handler for the post config bgp global operation @@ -675,6 +680,9 @@ func (o *LoxilbRestAPIAPI) Validate() error { if o.GetStatusProcessHandler == nil { unregistered = append(unregistered, "GetStatusProcessHandler") } + if o.GetVersionHandler == nil { + unregistered = append(unregistered, "GetVersionHandler") + } if o.PostConfigBfdHandler == nil { unregistered = append(unregistered, "PostConfigBfdHandler") } @@ -1035,6 +1043,10 @@ func (o *LoxilbRestAPIAPI) initHandlerCache() { o.handlers["GET"] = make(map[string]http.Handler) } o.handlers["GET"]["/status/process"] = NewGetStatusProcess(o.context, o.GetStatusProcessHandler) + if o.handlers["GET"] == nil { + o.handlers["GET"] = make(map[string]http.Handler) + } + o.handlers["GET"]["/version"] = NewGetVersion(o.context, o.GetVersionHandler) if o.handlers["POST"] == nil { o.handlers["POST"] = make(map[string]http.Handler) } diff --git a/api/restapi/server.go b/api/restapi/server.go index c61df9e2..10544451 100644 --- a/api/restapi/server.go +++ b/api/restapi/server.go @@ -3,12 +3,12 @@ package restapi import ( + "github.com/loxilb-io/loxilb/options" "context" "crypto/tls" "crypto/x509" "errors" "fmt" - "github.com/loxilb-io/loxilb/options" "log" "net" "net/http" diff --git a/api/swagger.yml b/api/swagger.yml index a1144e51..ac75898f 100644 --- a/api/swagger.yml +++ b/api/swagger.yml @@ -2808,7 +2808,31 @@ paths: description: Maintenance mode schema: $ref: '#/definitions/Error' - +#---------------------------------------------- +# Version +#---------------------------------------------- + '/version': + get: + summary: Get version information in the device + description: Get version information + responses: + '200': + description: OK + schema: + $ref: '#/definitions/VersionGetEntry' + '401': + description: Invalid authentication credentials + schema: + $ref: '#/definitions/Error' + '500': + description: Internal service error + schema: + $ref: '#/definitions/Error' + '503': + description: Maintenance mode + schema: + $ref: '#/definitions/Error' + #---------------------------------------------- # BFD #---------------------------------------------- @@ -4099,6 +4123,16 @@ definitions: type: string description: Current state for BFD session + VersionGetEntry: + type: object + properties: + version: + type: string + description: Instance name + buildInfo: + type: string + description: build info + BfdEntry: type: object properties: diff --git a/common/common.go b/common/common.go index e95794d3..2a15c9a3 100644 --- a/common/common.go +++ b/common/common.go @@ -20,6 +20,12 @@ import ( "net" ) +const ( + Version = "0.9.7-beta" +) + +var BuildInfo string = "" + // This file defines the go interface implementation needed to interact with loxinet go module const ( diff --git a/main.go b/main.go index 8f14699f..e214c54f 100644 --- a/main.go +++ b/main.go @@ -22,12 +22,13 @@ import ( "time" "github.com/jessevdk/go-flags" + "github.com/loxilb-io/loxilb/common" opts "github.com/loxilb-io/loxilb/options" ln "github.com/loxilb-io/loxilb/pkg/loxinet" ) -var version string = "0.9.7-beta" -var buildInfo string = "" +// var version string = "0.9.7-beta" +// var buildInfo string = "" func main() { fmt.Printf("loxilb start\n") @@ -40,7 +41,7 @@ func main() { } if opts.Opts.Version { - fmt.Printf("loxilb version: %s %s\n", version, buildInfo) + fmt.Printf("loxilb version: %s %s\n", common.Version, common.BuildInfo) os.Exit(0) } From 65cfc174e6e67bed2a2e223140593bb14eb516f0 Mon Sep 17 00:00:00 2001 From: doleebest Date: Thu, 9 Jan 2025 14:18:15 +0900 Subject: [PATCH 2/3] fix : makefile build --- .DS_Store | Bin 0 -> 8196 bytes .github/.DS_Store | Bin 0 -> 6148 bytes Makefile | 2 +- api/.DS_Store | Bin 0 -> 8196 bytes cicd/.DS_Store | Bin 0 -> 28676 bytes pkg/.DS_Store | Bin 0 -> 6148 bytes 6 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 .DS_Store create mode 100644 .github/.DS_Store create mode 100644 api/.DS_Store create mode 100644 cicd/.DS_Store create mode 100644 pkg/.DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..bec143b40e699869008f8c3c04999b8ef1a1997d GIT binary patch literal 8196 zcmeHML5tHs6#k~k+CneuZI3yKVnJb9)Po{%sTc9Eu((&(w%T1xH-+wkh(hon-W5d8 z;#Kh^=tU2LH}T?e_Ye3J1mDX{lQ&JHhXq;iO_}+^y!Y~b`I0u76o6UX8!Q7$09w=; z7uz(bD2sL9%32muyOAKSnX+Cm! zvBS)wEr)T75964PTcMboo%SE)=`gWH9n}GKpy~jx-9wzk5Zl<5>-WZ^*XLwxly%)&{uf9J2a>b7i{um!`mG1@`kJqRa%_%Rou!o*xN29}E@RuOX|VGChG}s3uA11I!>PdUPdJUwMoJ6>PBhFTa9{rE8mzeM4w#mV;~uWC)Yp8 znB-i0cX4{mMXh9=7ni)j$G6OTj5t$_=#yecasv-`X5*6o=H>mLr=I5L-P?!MP?sZh z02%9OBOwL%$b$quoWX4x$GGDw;>5a4sqOPdp{-`WQsv*XeZ9GgCaE1`m-LcvnD{!6 zpQfCd45_a(DD+jb%Il^+%hwaJpn%le#n98y+@F*Y$-i;GxOQBf^rQX$;hT;bD2sM2XklUbxI`B^&_zerxCnf*@ literal 0 HcmV?d00001 diff --git a/.github/.DS_Store b/.github/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..652ee18cf1e1e0697e6cf8c0b8ddc6775f000b3d GIT binary patch literal 6148 zcmeHK!AiqG5Pe%4Xi=m`j|(0==MU179s~uUdRE$^f+;DA^qOzbgMNlz;otZVzS&vZ zhE|IgDKb-L-)44Zck&i89RRNPI8K2MfEHD-(dMv5WLg`<%@%3xD%xla7z4(@oB{bhc&cC)u~H154i2FOAU0_Z!nyPk65}Ig5i3Qm zP@IMmHPpox!)Z9}KKf-5D@6^5i_M3NC%f38xNti6_rV=5Q?$_-Fb3)j?C4`h>VNypUC|ISzp$XcGt)LuMo0?)H(WJ;@qXe(Ts$|4^Y83 z&_v=3DEJ0Yn$(ey(oiSIzRuX5hoFHValIN}$M<;7nKLu%wL?T|IGYTJdPLO4VdAap zs2YmNo1<3dT#rUn7*BLa&uB^q)4jpChL#R-KpYSU!~t3y$`y1C?C@AkL%P7PPSruw%4~iHikCI~3>S)q`?Fm0Myc9*(>= zaKyyLf+G(n#luNCX605W%Ccjews2AjN2$dDaiH#iMpu`%D96fu7OvlSvNUJ-&7Vz} zG#ib!r`fj2ZQS_qWA**l$IZCOZ{hO&!Ps-!x41()l+wiPCiu+4GFV(D)bO@fYACaw zxt?v{TZ9KWJ{dmKnDtHu)+irxpWQFHD;Te!4HN5l02*A~b9%(PDE_){ulP*JojfeL z-MBRKto3Znrw!i{_G~hGjjMlwRvusZm!mo&L4?}AzuP=^p4CuZRXZxu(@#KV z-(5`88g0zqJb@z?{5M)CGXGl}q!I_N%z+Lw_ssf#t$qLh%Jd1bI3N!Ec?Z<|XgnH% zho|N`;T*a&j!hh<7+k^84nbugrr$2d5zBuVqODynak1ct42t{^ur^2~4*XRIE&zBX B5>EgC literal 0 HcmV?d00001 diff --git a/cicd/.DS_Store b/cicd/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..9fe2bc9d4167bcb18ffd4e9e790176f17fce308e GIT binary patch literal 28676 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 Rs+|9E#n$G?+edQ#{}0be-VXo( literal 0 HcmV?d00001 diff --git a/pkg/.DS_Store b/pkg/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..0fc5c7ffa8920acf4bcef04ebda218b88634f369 GIT binary patch literal 6148 zcmeHKy-LJD5S~3xE~3Q=7MAI3EKDUf5|0S>*NMe(p6Eeh4!r}*wAKo~fMDfo2)>0c z;5+!u&X7w;EESO%nEjIZ$+!6uvRNW>gT*8w>Jw1_XY8zDXfe*SH>{(P4WRSaxTXu5 zrth}S1OkL?G<(Y5eUpo0aL&f_;CfWX0rwBf;O50rhq9>D!|`| z5Y8AY7J~lMfx&M9fL(;W;h6Ul+!HFsiiIFDFej}*X?42AaMF%=sCBVoAt>$Sbo1eq z+360&d3Ibs^yTDYK^sj0Q=qQEik$X&{XhPG|6gyiGgH76_*V+JZZb>;xFua%8#l*m tZ3rL1*|@F{EL(8kmtxfNQoIfKhIq&az*w;mL Date: Thu, 16 Jan 2025 14:28:00 +0900 Subject: [PATCH 3/3] fix : dont track ds store --- .DS_Store | Bin 8196 -> 0 bytes .github/.DS_Store | Bin 6148 -> 0 bytes .gitignore | 1 + api/.DS_Store | Bin 8196 -> 0 bytes cicd/.DS_Store | Bin 28676 -> 0 bytes pkg/.DS_Store | Bin 6148 -> 0 bytes 6 files changed, 1 insertion(+) delete mode 100644 .DS_Store delete mode 100644 .github/.DS_Store delete mode 100644 api/.DS_Store delete mode 100644 cicd/.DS_Store delete mode 100644 pkg/.DS_Store diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index bec143b40e699869008f8c3c04999b8ef1a1997d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8196 zcmeHML5tHs6#k~k+CneuZI3yKVnJb9)Po{%sTc9Eu((&(w%T1xH-+wkh(hon-W5d8 z;#Kh^=tU2LH}T?e_Ye3J1mDX{lQ&JHhXq;iO_}+^y!Y~b`I0u76o6UX8!Q7$09w=; z7uz(bD2sL9%32muyOAKSnX+Cm! zvBS)wEr)T75964PTcMboo%SE)=`gWH9n}GKpy~jx-9wzk5Zl<5>-WZ^*XLwxly%)&{uf9J2a>b7i{um!`mG1@`kJqRa%_%Rou!o*xN29}E@RuOX|VGChG}s3uA11I!>PdUPdJUwMoJ6>PBhFTa9{rE8mzeM4w#mV;~uWC)Yp8 znB-i0cX4{mMXh9=7ni)j$G6OTj5t$_=#yecasv-`X5*6o=H>mLr=I5L-P?!MP?sZh z02%9OBOwL%$b$quoWX4x$GGDw;>5a4sqOPdp{-`WQsv*XeZ9GgCaE1`m-LcvnD{!6 zpQfCd45_a(DD+jb%Il^+%hwaJpn%le#n98y+@F*Y$-i;GxOQBf^rQX$;hT;bD2sM2XklUbxI`B^&_zerxCnf*@ diff --git a/.github/.DS_Store b/.github/.DS_Store deleted file mode 100644 index 652ee18cf1e1e0697e6cf8c0b8ddc6775f000b3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK!AiqG5Pe%4Xi=m`j|(0==MU179s~uUdRE$^f+;DA^qOzbgMNlz;otZVzS&vZ zhE|IgDKb-L-)44Zck&i89RRNPI8K2MfEHD-(dMv5WLg`<%@%3xD%xla7z4(@oB{bhc&cC)u~H154i2FOAU0_Z!nyPk65}Ig5i3Qm zP@IMmHPpox!)Z9}KKf-5D@6^5i_M3NC%f38xNti6_rV=5Q?$_-Fb3)j?C4`h>VNypUC|ISzp$XcGt)LuMo0?)H(WJ;@qXe(Ts$|4^Y83 z&_v=3DEJ0Yn$(ey(oiSIzRuX5hoFHValIN}$M<;7nKLu%wL?T|IGYTJdPLO4VdAap zs2YmNo1<3dT#rUn7*BLa&uB^q)4jpChL#R-KpYSU!~t3y$`y1C?C@AkL%P7PPSruw%4~iHikCI~3>S)q`?Fm0Myc9*(>= zaKyyLf+G(n#luNCX605W%Ccjews2AjN2$dDaiH#iMpu`%D96fu7OvlSvNUJ-&7Vz} zG#ib!r`fj2ZQS_qWA**l$IZCOZ{hO&!Ps-!x41()l+wiPCiu+4GFV(D)bO@fYACaw zxt?v{TZ9KWJ{dmKnDtHu)+irxpWQFHD;Te!4HN5l02*A~b9%(PDE_){ulP*JojfeL z-MBRKto3Znrw!i{_G~hGjjMlwRvusZm!mo&L4?}AzuP=^p4CuZRXZxu(@#KV z-(5`88g0zqJb@z?{5M)CGXGl}q!I_N%z+Lw_ssf#t$qLh%Jd1bI3N!Ec?Z<|XgnH% zho|N`;T*a&j!hh<7+k^84nbugrr$2d5zBuVqODynak1ct42t{^ur^2~4*XRIE&zBX B5>EgC diff --git a/cicd/.DS_Store b/cicd/.DS_Store deleted file mode 100644 index 9fe2bc9d4167bcb18ffd4e9e790176f17fce308e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28676 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 Rs+|9E#n$G?+edQ#{}0be-VXo( diff --git a/pkg/.DS_Store b/pkg/.DS_Store deleted file mode 100644 index 0fc5c7ffa8920acf4bcef04ebda218b88634f369..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKy-LJD5S~3xE~3Q=7MAI3EKDUf5|0S>*NMe(p6Eeh4!r}*wAKo~fMDfo2)>0c z;5+!u&X7w;EESO%nEjIZ$+!6uvRNW>gT*8w>Jw1_XY8zDXfe*SH>{(P4WRSaxTXu5 zrth}S1OkL?G<(Y5eUpo0aL&f_;CfWX0rwBf;O50rhq9>D!|`| z5Y8AY7J~lMfx&M9fL(;W;h6Ul+!HFsiiIFDFej}*X?42AaMF%=sCBVoAt>$Sbo1eq z+360&d3Ibs^yTDYK^sj0Q=qQEik$X&{XhPG|6gyiGgH76_*V+JZZb>;xFua%8#l*m tZ3rL1*|@F{EL(8kmtxfNQoIfKhIq&az*w;mL