horizoncd/horizon

View on GitHub
pkg/cluster/registry/harbor/v2/mockserver/server.go

Summary

Maintainability
D
2 days
Test Coverage
Similar blocks of code found in 2 locations. Consider refactoring.
// Copyright © 2023 Horizoncd.
//
// 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 mockserver
 
import (
"fmt"
"net/http"
"strconv"
 
"github.com/gorilla/mux"
)
 
type HarborProject struct {
ID int
Name string
Public bool
Members []*ProjectMember
Repositories []*ProjectRepository
}
 
type ProjectMember struct {
Username string
Role int
}
 
type ProjectRepository struct {
Name string
Tags []string
}
 
type HarborServer struct {
R *mux.Router
Projects map[string]*HarborProject
projectID int
}
 
func NewHarborServer() *HarborServer {
r := mux.NewRouter()
s := &HarborServer{
R: r,
Projects: map[string]*HarborProject{},
projectID: 1,
}
r.Path("/api/v2.0/projects/{project}/repositories/{repository}").
Methods(http.MethodDelete).HandlerFunc(s.DeleteRepository)
return s
}
 
func (s *HarborServer) CreateProject(projectName string, metadata map[string]string) {
if len(projectName) == 0 {
return
}
 
for _, v := range s.Projects {
if v.Name == projectName {
return
}
}
 
publicBool := false
if publicStr, ok := metadata["public"]; ok {
publicBool, _ = strconv.ParseBool(publicStr)
}
 
project := &HarborProject{
ID: s.projectID,
Name: projectName,
Public: publicBool,
Members: nil,
Repositories: nil,
}
s.Projects[strconv.Itoa(s.projectID)] = project
s.projectID++
}
 
func (s *HarborServer) PushImage(projectName string, repository string, tag string) {
if projectName == "" || repository == "" || tag == "" {
return
}
projectID := ""
for _, v := range s.Projects {
if v.Name == projectName {
projectID = strconv.Itoa(v.ID)
break
}
}
if projectID == "" {
return
}
var index int
var repo *ProjectRepository
for k, v := range s.Projects[projectID].Repositories {
if v.Name == repository {
index = k
repo = v
break
}
}
if repo != nil {
s.Projects[projectID].Repositories[index].Tags = append(s.Projects[projectID].Repositories[index].Tags, tag)
} else {
s.Projects[projectID].Repositories = append(s.Projects[projectID].Repositories, &ProjectRepository{
Name: repository,
Tags: []string{tag},
})
}
}
 
func (s *HarborServer) DeleteRepository(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
project, repository := vars["project"], vars["repository"]
var projectID = ""
for _, v := range s.Projects {
if v.Name == project {
projectID = strconv.Itoa(v.ID)
break
}
}
if projectID == "" {
s.responseError(w, http.StatusNotFound, fmt.Errorf("project %s not found", project))
return
}
index := -1
for k, v := range s.Projects[projectID].Repositories {
if v.Name == repository {
index = k
break
}
}
if index == -1 {
s.responseError(w, http.StatusNotFound, fmt.Errorf("repository %s not found", repository))
return
}
if index == 0 {
s.Projects[projectID].Repositories = s.Projects[projectID].Repositories[index+1:]
} else {
s.Projects[projectID].Repositories = append(s.Projects[projectID].Repositories[:index-1],
s.Projects[projectID].Repositories[index+1:]...)
}
w.WriteHeader(http.StatusOK)
}
 
func (s *HarborServer) responseError(w http.ResponseWriter, code int, err error) {
w.WriteHeader(code)
if err != nil {
_, _ = w.Write([]byte(err.Error()))
}
}