Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
OpenDAS
ollama
Commits
a2fc933f
Commit
a2fc933f
authored
Apr 17, 2024
by
Michael Yang
Browse files
update delete handler to use model.Name
parent
0e331c71
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
99 additions
and
35 deletions
+99
-35
server/layer.go
server/layer.go
+23
-0
server/manifest.go
server/manifest.go
+67
-9
server/routes.go
server/routes.go
+9
-26
No files found.
server/layer.go
View file @
a2fc933f
...
@@ -88,3 +88,26 @@ func (l *Layer) Open() (io.ReadCloser, error) {
...
@@ -88,3 +88,26 @@ func (l *Layer) Open() (io.ReadCloser, error) {
return
os
.
Open
(
blob
)
return
os
.
Open
(
blob
)
}
}
func
(
l
*
Layer
)
Remove
()
error
{
ms
,
err
:=
Manifests
()
if
err
!=
nil
{
return
err
}
for
_
,
m
:=
range
ms
{
for
_
,
layer
:=
range
append
(
m
.
Layers
,
m
.
Config
)
{
if
layer
.
Digest
==
l
.
Digest
{
// something is using this layer
return
nil
}
}
}
blob
,
err
:=
GetBlobsPath
(
l
.
Digest
)
if
err
!=
nil
{
return
err
}
return
os
.
Remove
(
blob
)
}
server/manifest.go
View file @
a2fc933f
...
@@ -14,7 +14,9 @@ import (
...
@@ -14,7 +14,9 @@ import (
type
Manifest
struct
{
type
Manifest
struct
{
ManifestV2
ManifestV2
Digest
string
`json:"-"`
filepath
string
digest
string
}
}
func
(
m
*
Manifest
)
Size
()
(
size
int64
)
{
func
(
m
*
Manifest
)
Size
()
(
size
int64
)
{
...
@@ -25,9 +27,28 @@ func (m *Manifest) Size() (size int64) {
...
@@ -25,9 +27,28 @@ func (m *Manifest) Size() (size int64) {
return
return
}
}
func
ParseNamedManifest
(
name
model
.
Name
)
(
*
Manifest
,
error
)
{
func
(
m
*
Manifest
)
Remove
()
error
{
if
!
name
.
IsFullyQualified
()
{
if
err
:=
os
.
Remove
(
m
.
filepath
);
err
!=
nil
{
return
nil
,
model
.
Unqualified
(
name
)
return
err
}
for
_
,
layer
:=
range
append
(
m
.
Layers
,
m
.
Config
)
{
if
err
:=
layer
.
Remove
();
err
!=
nil
{
return
err
}
}
manifests
,
err
:=
GetManifestPath
()
if
err
!=
nil
{
return
err
}
return
PruneDirectory
(
manifests
)
}
func
ParseNamedManifest
(
n
model
.
Name
)
(
*
Manifest
,
error
)
{
if
!
n
.
IsFullyQualified
()
{
return
nil
,
model
.
Unqualified
(
n
)
}
}
manifests
,
err
:=
GetManifestPath
()
manifests
,
err
:=
GetManifestPath
()
...
@@ -35,20 +56,24 @@ func ParseNamedManifest(name model.Name) (*Manifest, error) {
...
@@ -35,20 +56,24 @@ func ParseNamedManifest(name model.Name) (*Manifest, error) {
return
nil
,
err
return
nil
,
err
}
}
var
manifest
ManifestV2
p
:=
filepath
.
Join
(
manifests
,
n
.
Filepath
())
manifestfile
,
err
:=
os
.
Open
(
filepath
.
Join
(
manifests
,
name
.
Filepath
()))
var
m
ManifestV2
f
,
err
:=
os
.
Open
(
p
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
defer
f
.
Close
()
sha256sum
:=
sha256
.
New
()
sha256sum
:=
sha256
.
New
()
if
err
:=
json
.
NewDecoder
(
io
.
TeeReader
(
manifestfile
,
sha256sum
))
.
Decode
(
&
m
anifest
);
err
!=
nil
{
if
err
:=
json
.
NewDecoder
(
io
.
TeeReader
(
f
,
sha256sum
))
.
Decode
(
&
m
);
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
return
&
Manifest
{
return
&
Manifest
{
ManifestV2
:
manifest
,
ManifestV2
:
m
,
Digest
:
fmt
.
Sprintf
(
"%x"
,
sha256sum
.
Sum
(
nil
)),
filepath
:
p
,
digest
:
fmt
.
Sprintf
(
"%x"
,
sha256sum
.
Sum
(
nil
)),
},
nil
},
nil
}
}
...
@@ -77,3 +102,36 @@ func WriteManifest(name string, config *Layer, layers []*Layer) error {
...
@@ -77,3 +102,36 @@ func WriteManifest(name string, config *Layer, layers []*Layer) error {
return
os
.
WriteFile
(
manifestPath
,
b
.
Bytes
(),
0
o644
)
return
os
.
WriteFile
(
manifestPath
,
b
.
Bytes
(),
0
o644
)
}
}
func
Manifests
()
(
map
[
model
.
Name
]
*
Manifest
,
error
)
{
manifests
,
err
:=
GetManifestPath
()
if
err
!=
nil
{
return
nil
,
err
}
// TODO(mxyng): use something less brittle
matches
,
err
:=
filepath
.
Glob
(
fmt
.
Sprintf
(
"%s/*/*/*/*"
,
manifests
))
if
err
!=
nil
{
return
nil
,
err
}
ms
:=
make
(
map
[
model
.
Name
]
*
Manifest
)
for
_
,
match
:=
range
matches
{
rel
,
err
:=
filepath
.
Rel
(
manifests
,
match
)
if
err
!=
nil
{
return
nil
,
err
}
n
:=
model
.
ParseNameFromFilepath
(
rel
)
if
n
.
IsValid
()
{
m
,
err
:=
ParseNamedManifest
(
n
)
if
err
!=
nil
{
return
nil
,
err
}
ms
[
n
]
=
m
}
}
return
ms
,
nil
}
server/routes.go
View file @
a2fc933f
...
@@ -574,48 +574,31 @@ func (s *Server) CreateModelHandler(c *gin.Context) {
...
@@ -574,48 +574,31 @@ func (s *Server) CreateModelHandler(c *gin.Context) {
}
}
func
(
s
*
Server
)
DeleteModelHandler
(
c
*
gin
.
Context
)
{
func
(
s
*
Server
)
DeleteModelHandler
(
c
*
gin
.
Context
)
{
var
req
api
.
DeleteRequest
var
r
api
.
DeleteRequest
err
:=
c
.
ShouldBindJSON
(
&
req
)
if
err
:=
c
.
ShouldBindJSON
(
&
r
);
errors
.
Is
(
err
,
io
.
EOF
)
{
switch
{
case
errors
.
Is
(
err
,
io
.
EOF
)
:
c
.
AbortWithStatusJSON
(
http
.
StatusBadRequest
,
gin
.
H
{
"error"
:
"missing request body"
})
c
.
AbortWithStatusJSON
(
http
.
StatusBadRequest
,
gin
.
H
{
"error"
:
"missing request body"
})
return
return
case
err
!=
nil
:
}
else
if
err
!=
nil
{
c
.
AbortWithStatusJSON
(
http
.
StatusBadRequest
,
gin
.
H
{
"error"
:
err
.
Error
()})
c
.
AbortWithStatusJSON
(
http
.
StatusBadRequest
,
gin
.
H
{
"error"
:
err
.
Error
()})
return
return
}
}
var
model
string
n
:=
model
.
ParseName
(
cmp
.
Or
(
r
.
Model
,
r
.
Name
))
if
req
.
Model
!=
""
{
if
!
n
.
IsValid
()
{
model
=
req
.
Model
c
.
AbortWithStatusJSON
(
http
.
StatusBadRequest
,
gin
.
H
{
"error"
:
fmt
.
Sprintf
(
"name %q is invalid"
,
cmp
.
Or
(
r
.
Model
,
r
.
Name
))})
}
else
if
req
.
Name
!=
""
{
model
=
req
.
Name
}
else
{
c
.
AbortWithStatusJSON
(
http
.
StatusBadRequest
,
gin
.
H
{
"error"
:
"model is required"
})
return
}
if
err
:=
DeleteModel
(
model
);
err
!=
nil
{
if
os
.
IsNotExist
(
err
)
{
c
.
JSON
(
http
.
StatusNotFound
,
gin
.
H
{
"error"
:
fmt
.
Sprintf
(
"model '%s' not found"
,
model
)})
}
else
{
c
.
JSON
(
http
.
StatusInternalServerError
,
gin
.
H
{
"error"
:
err
.
Error
()})
}
return
return
}
}
m
anifestsPath
,
err
:=
Get
Manifest
Path
()
m
,
err
:=
ParseNamed
Manifest
(
n
)
if
err
!=
nil
{
if
err
!=
nil
{
c
.
JSON
(
http
.
StatusInternalServerError
,
gin
.
H
{
"error"
:
err
.
Error
()})
c
.
JSON
(
http
.
StatusInternalServerError
,
gin
.
H
{
"error"
:
err
.
Error
()})
return
return
}
}
if
err
:=
PruneDirectory
(
manifestsPath
);
err
!=
nil
{
if
err
:=
m
.
Remove
(
);
err
!=
nil
{
c
.
JSON
(
http
.
StatusInternalServerError
,
gin
.
H
{
"error"
:
err
.
Error
()})
c
.
JSON
(
http
.
StatusInternalServerError
,
gin
.
H
{
"error"
:
err
.
Error
()})
return
return
}
}
c
.
JSON
(
http
.
StatusOK
,
nil
)
}
}
func
(
s
*
Server
)
ShowModelHandler
(
c
*
gin
.
Context
)
{
func
(
s
*
Server
)
ShowModelHandler
(
c
*
gin
.
Context
)
{
...
@@ -769,7 +752,7 @@ func (s *Server) ListModelsHandler(c *gin.Context) {
...
@@ -769,7 +752,7 @@ func (s *Server) ListModelsHandler(c *gin.Context) {
Model
:
n
.
DisplayShortest
(),
Model
:
n
.
DisplayShortest
(),
Name
:
n
.
DisplayShortest
(),
Name
:
n
.
DisplayShortest
(),
Size
:
m
.
Size
(),
Size
:
m
.
Size
(),
Digest
:
m
.
D
igest
,
Digest
:
m
.
d
igest
,
ModifiedAt
:
info
.
ModTime
(),
ModifiedAt
:
info
.
ModTime
(),
Details
:
api
.
ModelDetails
{
Details
:
api
.
ModelDetails
{
Format
:
c
.
ModelFormat
,
Format
:
c
.
ModelFormat
,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment