github.com/deemoprobe/k8s-first-commit@v0.0.0-20230430165612-a541f1982be3/pkg/registry/task_registry.go (about) 1 /* 2 Copyright 2014 Google Inc. All rights reserved. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 package registry 17 18 import ( 19 "encoding/json" 20 "fmt" 21 "net/url" 22 23 . "github.com/GoogleCloudPlatform/kubernetes/pkg/api" 24 "github.com/GoogleCloudPlatform/kubernetes/pkg/apiserver" 25 "github.com/GoogleCloudPlatform/kubernetes/pkg/client" 26 ) 27 28 // TaskRegistryStorage implements the RESTStorage interface in terms of a TaskRegistry 29 type TaskRegistryStorage struct { 30 registry TaskRegistry 31 containerInfo client.ContainerInfo 32 scheduler Scheduler 33 } 34 35 func MakeTaskRegistryStorage(registry TaskRegistry, containerInfo client.ContainerInfo, scheduler Scheduler) apiserver.RESTStorage { 36 return &TaskRegistryStorage{ 37 registry: registry, 38 containerInfo: containerInfo, 39 scheduler: scheduler, 40 } 41 } 42 43 // LabelMatch tests to see if a Task's labels map contains 'key' mapping to 'value' 44 func LabelMatch(task Task, queryKey, queryValue string) bool { 45 for key, value := range task.Labels { 46 if queryKey == key && queryValue == value { 47 return true 48 } 49 } 50 return false 51 } 52 53 // LabelMatch tests to see if a Task's labels map contains all key/value pairs in 'labelQuery' 54 func LabelsMatch(task Task, labelQuery *map[string]string) bool { 55 if labelQuery == nil { 56 return true 57 } 58 for key, value := range *labelQuery { 59 if !LabelMatch(task, key, value) { 60 return false 61 } 62 } 63 return true 64 } 65 66 func (storage *TaskRegistryStorage) List(url *url.URL) (interface{}, error) { 67 var result TaskList 68 var query *map[string]string 69 if url != nil { 70 queryMap := client.DecodeLabelQuery(url.Query().Get("labels")) 71 query = &queryMap 72 } 73 tasks, err := storage.registry.ListTasks(query) 74 if err == nil { 75 result = TaskList{ 76 Items: tasks, 77 } 78 } 79 return result, err 80 } 81 82 func (storage *TaskRegistryStorage) Get(id string) (interface{}, error) { 83 task, err := storage.registry.GetTask(id) 84 if err != nil { 85 return task, err 86 } 87 info, err := storage.containerInfo.GetContainerInfo(task.CurrentState.Host, id) 88 if err != nil { 89 return task, err 90 } 91 task.CurrentState.Info = info 92 return task, err 93 } 94 95 func (storage *TaskRegistryStorage) Delete(id string) error { 96 return storage.registry.DeleteTask(id) 97 } 98 99 func (storage *TaskRegistryStorage) Extract(body string) (interface{}, error) { 100 task := Task{} 101 err := json.Unmarshal([]byte(body), &task) 102 return task, err 103 } 104 105 func (storage *TaskRegistryStorage) Create(task interface{}) error { 106 taskObj := task.(Task) 107 if len(taskObj.ID) == 0 { 108 return fmt.Errorf("ID is unspecified: %#v", task) 109 } 110 machine, err := storage.scheduler.Schedule(taskObj) 111 if err != nil { 112 return err 113 } 114 return storage.registry.CreateTask(machine, taskObj) 115 } 116 117 func (storage *TaskRegistryStorage) Update(task interface{}) error { 118 return storage.registry.UpdateTask(task.(Task)) 119 }