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
orangecat
ollama
Commits
a2fc933f
You need to sign in or sign up before continuing.
Commit
a2fc933f
authored
Apr 17, 2024
by
Michael Yang
Browse files
update delete handler to use model.Name
parent
0e331c71
Changes
3
Hide 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