Mount NFS directories into container. Use bootstrap script to first cd into correct working directory for transcode. String replace ffmpeg progress URL.

This commit is contained in:
James Munnelly
2015-09-10 09:41:27 +01:00
parent 8e3dcfc817
commit b232ceec3c
4 changed files with 96 additions and 19 deletions
+3
View File
@@ -13,8 +13,11 @@ RUN mkdir /pms && \
cd / && \ cd / && \
rm -Rf /pms rm -Rf /pms
WORKDIR /plexmediaserver WORKDIR /plexmediaserver
ADD bootstrap.sh .
ENV LD_LIBRARY_PATH "/plexmediaserver" ENV LD_LIBRARY_PATH "/plexmediaserver"
ENTRYPOINT ["/plexmediaserver/Resources/Plex New Transcoder"] ENTRYPOINT ["/plexmediaserver/Resources/Plex New Transcoder"]
Executable
+5
View File
@@ -0,0 +1,5 @@
#!/bin/bash
cd $1
/plexmediaserver/Resources/Plex\ New\ Transcoder "${@:2}"
+52 -17
View File
@@ -2,6 +2,8 @@ package kubernetes
import ( import (
"time" "time"
"errors"
"fmt"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/client" "k8s.io/kubernetes/pkg/client"
@@ -15,7 +17,7 @@ import (
const podBasename = "plex-transcoder" const podBasename = "plex-transcoder"
const kubernetesHost = "10.20.40.254:8080" const kubernetesHost = "10.20.40.254:8080"
const kubernetesNamespace = "plex" const kubernetesNamespace = "plex"
const dockerImage = "registry.marley.xyz/e720/plex-new-transcoder" const dockerImage = "munnerz/plex-new-transcoder"
type KubernetesExecutor struct { type KubernetesExecutor struct {
executors.AbstractExecutor executors.AbstractExecutor
@@ -30,25 +32,56 @@ type KubernetesExecutor struct {
func (e *KubernetesExecutor) createPod() *api.Pod { func (e *KubernetesExecutor) createPod() *api.Pod {
return &api.Pod{ return &api.Pod{
TypeMeta: api.TypeMeta{ TypeMeta: api.TypeMeta{
Kind: "Pod", Kind: "Pod",
}, },
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
GenerateName: podBasename, GenerateName: podBasename,
Namespace: e.Namespace, Namespace: e.Namespace,
}, },
Spec: api.PodSpec{ Spec: api.PodSpec{
RestartPolicy: api.RestartPolicyNever, Volumes: []api.Volume{
Containers: []api.Container{ api.Volume{
api.Container{ Name: "source-dir",
Name: podBasename, VolumeSource: api.VolumeSource {
Image: e.Image, NFS: &api.NFSVolumeSource {
Command: e.Job.Command, Server: "10.12.14.16",
Args: e.Job.Args, Path: "/tank/media",
ReadOnly: true,
}, },
}, },
}, },
} api.Volume{
Name: "transcode-dir",
VolumeSource: api.VolumeSource {
NFS: &api.NFSVolumeSource {
Server: "10.12.14.16",
Path: "/ssd/plex/Buffer",
},
},
},
},
RestartPolicy: api.RestartPolicyNever,
Containers: []api.Container{
api.Container{
Name: podBasename,
Image: e.Image,
Command: e.Job.Command,
Args: e.Job.Args,
VolumeMounts: []api.VolumeMount{
api.VolumeMount{
Name: "source-dir",
MountPath: "/tank/media",
},
api.VolumeMount{
Name: "transcode-dir",
MountPath: "/ssd/plex/Buffer",
},
},
},
},
},
}
} }
func (e *KubernetesExecutor) Start() error { func (e *KubernetesExecutor) Start() error {
@@ -112,6 +145,8 @@ func (e *KubernetesExecutor) WaitForState(targetState executors.ExecutorPhase) e
switch podPhaseToExecutorPhase(pod.Status.Phase) { switch podPhaseToExecutorPhase(pod.Status.Phase) {
case targetState: case targetState:
break Loop break Loop
case executors.ExecutorFailed:
return errors.New(fmt.Sprintf("Pod failed whilst waiting for state: %s\nReason: %s", targetState, pod.Status.Reason))
default: default:
break Switch break Switch
} }
+36 -2
View File
@@ -4,6 +4,8 @@ import (
"os" "os"
"os/signal" "os/signal"
"syscall" "syscall"
"fmt"
"strings"
log "github.com/Sirupsen/logrus" log "github.com/Sirupsen/logrus"
@@ -13,6 +15,12 @@ import (
_ "github.com/munnerz/plex-elastic-transcoder/executors/kubernetes" _ "github.com/munnerz/plex-elastic-transcoder/executors/kubernetes"
) )
const (
cmdPath = "/plexmediaserver/bootstrap.sh"
logFilePath = "/var/log/plex/plex-elastic-transcoder.log"
plexServerURL = "10.12.14.16:32400"
)
var executor executors.Executor var executor executors.Executor
func signals() { func signals() {
@@ -39,16 +47,42 @@ func signals() {
os.Exit(0) os.Exit(0)
}() }()
} }
func main() { func main() {
// Setup signals // Setup signals
signals() signals()
// Setup logs
fo, err := os.Create(logFilePath)
if err != nil {
panic(fmt.Sprintf("Error opening log file: %s", err))
}
defer func() {
if err := fo.Close(); err != nil {
panic(fmt.Sprintf("Error closing file: %s", err))
}
}()
log.SetOutput(fo)
// Get the arguments passed to Plex New Transcoder // Get the arguments passed to Plex New Transcoder
args := os.Args[1:] args := os.Args[1:]
wd, _ := os.Getwd()
for i, arg := range args {
if arg == "-progressurl" {
// Change the progress URL to report to about the transcode
args[i + 1] = strings.Replace(args[i+1], "127.0.0.1:32400", plexServerURL, 1)
}
}
args = append([]string{wd}, args)
log.Print("In WD: ", wd)
log.Print("Dispatching job with args: ", args) log.Print("Dispatching job with args: ", args)
job := executors.Job{ job := executors.Job{
Command: []string{"/Plex New Transcoder"}, Command: []string{cmdPath},
Args: args, Args: args,
} }
@@ -56,7 +90,7 @@ func main() {
log.Print("Created executor: ", executor) log.Print("Created executor: ", executor)
err := executor.Start() err = executor.Start()
if err != nil { if err != nil {
log.Fatal("Job start failed with error: ", err) log.Fatal("Job start failed with error: ", err)
} }