summaryrefslogtreecommitdiffstats
path: root/src/main/java/org/openslx/libvirt/domain/device/Video.java
blob: a674715464372ea84385f88285f4c0f30d3f4c75 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
package org.openslx.libvirt.domain.device;

import org.openslx.libvirt.xml.LibvirtXmlNode;

/**
 * A video (GPU) device node in a Libvirt domain XML document.
 * 
 * @author Manuel Bentele
 * @version 1.0
 */
public class Video extends Device
{
	/**
	 * Creates an empty video device.
	 */
	public Video()
	{
		super();
	}

	/**
	 * Creates a video device representing an existing Libvirt XML video device element.
	 * 
	 * @param xmlNode existing Libvirt XML video device element.
	 */
	public Video( LibvirtXmlNode xmlNode )
	{
		super( xmlNode );
	}

	/**
	 * Returns hardware model of the video device.
	 * 
	 * @return hardware model of the video device.
	 */
	public Model getModel()
	{
		String model = this.getXmlElementAttributeValue( "model", "type" );
		return Model.fromString( model );
	}

	/**
	 * Sets hardware model for the video device.
	 * 
	 * @param model hardware model for the video device.
	 */
	public void setModel( Model model )
	{
		this.setXmlElementAttributeValue( "model", "type", model.toString() );
	}

	/**
	 * Checks whether 2D hardware video acceleration is turned on or off.
	 * 
	 * @return state of 2D hardware video acceleration.
	 */
	public boolean get2DAcceleration()
	{
		return this.getXmlElementAttributeValueAsBool( "model/acceleration", "accel2d" );
	}

	/**
	 * Turns 2D hardware video acceleration on or off.
	 * 
	 * @param acceleration state of 2D hardware video acceleration.
	 */
	public void set2DAcceleration( boolean acceleration )
	{
		Model model = this.getModel();

		if ( model != null ) {
			if ( model == Model.VIRTIO ) {
				// only set acceleration on supported Virtio GPUs
				this.setXmlElementAttributeValueYesNo( "model/acceleration", "accel2d", acceleration );
			} else {
				String errorMsg =
						"Video card model '" + model.toString() + "' does not support enabled 2D hardware acceleration.";
				throw new IllegalArgumentException( errorMsg );
			}
		}
	}

	/**
	 * Checks whether 3D hardware video acceleration is turned on or off.
	 * 
	 * @return state of 3D hardware video acceleration.
	 */
	public boolean get3DAcceleration()
	{
		return this.getXmlElementAttributeValueAsBool( "model/acceleration", "accel3d" );
	}

	/**
	 * Turns 3D hardware video acceleration on or off.
	 * 
	 * @param acceleration state of 3D hardware video acceleration.
	 */
	public void set3DAcceleration( boolean acceleration )
	{
		Model model = this.getModel();

		if ( model == Model.VIRTIO ) {
			// only set acceleration on supported Virtio GPUs
			this.setXmlElementAttributeValueYesNo( "model/acceleration", "accel3d", acceleration );
		} else {
			String errorMsg =
					"Video card model '" + model.toString() + "' does not support enabled 3D hardware acceleration.";
			throw new IllegalArgumentException( errorMsg );
		}
	}

	/**
	 * Disables the video device by setting the model to {@link Model#NONE}.
	 */
	public void disable()
	{
		this.removeXmlElementChilds();
		this.setModel( Model.NONE );
	}

	/**
	 * Creates a non-existent video device as Libvirt XML device element.
	 * 
	 * @param xmlNode Libvirt XML node of the Libvirt XML device that is created.
	 * @return created video device instance.
	 */
	public static Video createInstance( LibvirtXmlNode xmlNode )
	{
		return Video.newInstance( xmlNode );
	}

	/**
	 * Creates a video device representing an existing Libvirt XML video device element.
	 * 
	 * @param xmlNode existing Libvirt XML video device element.
	 * @return video device instance.
	 */
	public static Video newInstance( LibvirtXmlNode xmlNode )
	{
		return new Video( xmlNode );
	}

	/**
	 * Model of video device.
	 * 
	 * @author Manuel Bentele
	 * @version 1.0
	 */
	public enum Model
	{
		// @formatter:off
		NONE  ( "none" ),
		QXL   ( "qxl" ),
		VGA   ( "vga" ),
		VMVGA ( "vmvga" ),
		VIRTIO( "virtio" );
		// @formatter:on

		/**
		 * Name of the video device model.
		 */
		private String model = null;

		/**
		 * Creates video device model.
		 * 
		 * @param type valid name of the video device model in a Libvirt domain XML document.
		 */
		Model( String model )
		{
			this.model = model;
		}

		@Override
		public String toString()
		{
			return this.model;
		}

		/**
		 * Creates video device model from its name with error check.
		 * 
		 * @param model name of the video device model in a Libvirt domain XML document.
		 * @return valid video device model.
		 */
		public static Model fromString( String model )
		{
			for ( Model m : Model.values() ) {
				if ( m.model.equalsIgnoreCase( model ) ) {
					return m;
				}
			}

			return null;
		}
	}
}